1 голос
 
1489 просмотров
23.11.2017 / 19:41  Magatino

Виртуальные кнопки

Если нажать на кнопку, то срабатывает какое-то действие, а как сделать так, когда водишь пальцем по экрану, значит водишь водишь, и дошёл до кнопки и она сработала?
Немного уточну, я делаю виртуальный джостик под типа как на эмуляторах приставок PS1 и Sega.
Изм. Magatino от 23.11.2017 / 21:29
Ответы
 
3 голоса
 
# 24.11.2017 / 10:29  aNNiMON
Начиная с Android API 14, появился метод view.setOnHoverListener(View.OnHoverListener listener) и события MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_EXIT и MotionEvent.ACTION_HOVER_MOVE.

  1. view.setOnHoverListener(new View.OnHoverListener() {
  2.     @Override
  3.     public boolean onHover(View v, MotionEvent event) {
  4.         switch (event.getAction()) {
  5.             case MotionEvent.ACTION_HOVER_ENTER:
  6.                 break;
  7.             case MotionEvent.ACTION_HOVER_MOVE:
  8.                 break;
  9.             case MotionEvent.ACTION_HOVER_EXIT:
  10.                 break;
  11.         }
  12.         return false;
  13.     }
  14. });
 
1 голос
 
# 29.11.2017 / 22:19  Magatino
  1.         button1 = (ImageButton)findViewById(R.id.imageButton1);
  2.                 button2 = (ImageButton)findViewById(R.id.imageButton2);    
  3.     button1.setOnTouchListener(OTL);
  4.         button2.setOnTouchListener(OTL);
  5. }
  6.  
  7.     View.OnTouchListener OTL = new View.OnTouchListener()
  8.     {
  9.  
  10.     public boolean onTouch(View view, MotionEvent event)
  11.     {
  12.  
  13. if (event.getAction()==MotionEvent.ACTION_DOWN)
  14. mThread.x++;
  15.  
  16. }
  17. };

По коду видно, если я просто нажму на любую область экрана, то произойдёт действие.
Но на деле, действие происходит лишь тогда, когда я только нажимаю на кнопки, которые я запихал в OnTouchListener, то есть MotionEvent.ACTION_DOWN срабатывает на нажатие тех кнопок, которые в OnTouchListener.
А MotionEvent.ACTION_MOVE , как-то странно работает, как будто ты зажал кнопку.

Перейдя на метод OnTouchEvent(Event event) у меня почти сразу всё получилось.
MotionEvent.ACTION_DOWN и MotionEvent.ACTION_MOVE работали как надо, в принципе ничего не менял в коде, лишь добавил проверку попадания пальца в область кнопок.

Короче, как-то так :gg:
Изм. Magatino от 29.11.2017 / 22:20
30.11.2017 / 02:55  Витаминыч
Молодец! :kul:
 
1 голос
 
# 23.11.2017 / 23:56  Витаминыч
В документации есть описание момента, когда пользователь нажал, НО не отпустил палец, уводит в сторону и отпускает. Листнеру посылается сигнал соответсьвующий и действие не происходит.
Это для UI дефолтного, ты же сам можешь реализовать свой листенер с чеком состояния (не_нажато, удерживается, нажато_смещается, отпущено) и проверкой координат.

Моя теория, практики не имел, но читал статьи. Можешь загуглить пример, как делают джойстик (или просто стик, не крестовина), который как шарик и в играх обычно камерой управляет и эту механику на крестовину перенести, с "невидимым" шариком :gg: Когда он окажется в одной из четвертей, то и вызывать соответ. метод.
 
1 голос
 
# 23.11.2017 / 21:16  Koenig
Надо снимать координаты в момент отрыва пальца
Вроде можно нажать и водить, но выполняться не будет
23.11.2017 / 21:26  Magatino
В виртуальных джостиках редко отрываешь палец (имеется ввиду D-pad, креставина), так что такое не годится.
 
0 голосов
 
# 3.09.2018 / 11:44  Aladdin
На примерах javafx видел подобное, там перетаскивается окно, посмотри может пригодится
 
0 голосов
 
# 29.08.2018 / 07:02  SuperSystem
import android.app.*;
import android.content.*;
import android.graphics.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;

public class MainActivity extends Activity
{
private TextView tv;
private int i;
     public void onCreate(Bundle savedInstanceState)
{
         super.onCreate(savedInstanceState);
RelativeLayout rl = new RelativeLayout(this);
tv = new TextView(this);
tv.setText("0");
GameButton gb = new GameButton(this);
gb.setWidth(100);
gb.setHeight(50);
gb.setClick(new Comand(){
public void onStart(){
tv.setText(String.valueOf(i));
tv.invalidate();
i ++;
}
});
rl.addView(gb);
rl.addView(tv);
         setContentView(rl);
     }
public class GameButton extends View {
private float x,y;
private float w,h;
private float tx,ty;
private int A;
private boolean click;
private Paint p;
public Comand com;
public GameButton(Context context){
super(context);
p = new Paint();
p.setColor(0xffff0000);
click = false;
}
public void setX(float X){
x = X;
}
public void setY(float Y){
y = Y;
}
public void setWidth(float W){
w = W;
}
public void setHeight(float H){
h = H;
}
public void setClick(Comand C){
com = C;
}
public void onDraw(Canvas c){
super.onDraw(c);
c.drawRect(x,y,x + w,y + h,p);
if (click) {
com.onStart();
}
invalidate();
}
public boolean onTouchEvent(MotionEvent me){
tx = me.getX();
ty = me.getY();
A = me.getAction();
if (tx > x && tx < x + w && ty > y && ty < y + h){
p.setColor(0xff00ff00);
click = true;
} else {
p.setColor(0xffff0000);
click = false;
}
if (A == 1){
p.setColor(0xffff0000);
click = false;
}
return true;
}
}
interface Comand{
void onStart();
}
}
29.08.2018 / 07:05  SuperSystem
Незнаю нужно или нет но может пригодиться :)
 
0 голосов
 
# 27.11.2017 / 20:34  Naik
Повесь тач листенер и обрабатывай что хочешь и как хочешь
Изм. Naik от 27.11.2017 / 20:34
27.11.2017 / 20:56  Magatino
Так любой написать может.
Завтра попробую кое-что протестить и отпишусь, что и до как.
29.11.2017 / 22:20  Naik
А тут другого ответа и быть не может. Или мне написать надо было проект семпл на гитхабе ради не пойми кого?
Всего: 7

Реклама

Мы в соцсетях

tw tg yt gt