如何在处理 ACTION_MOVE 时用另一根手指检测 TOUCH 事件
How to detect a TOUCH event with another finger while an ACTION_MOVE is in process
我正在开发一款游戏,我需要能够检测到一根手指正在执行移动,而另一根手指可能会触摸屏幕的另一部分。
使用下面的代码我可以检测到 ACTION_MOVE(在屏幕的特定区域)和 ACTION_DOWN
public boolean onTouch(View v, MotionEvent event) {
final int dest_x = (int) event.getX();
final int dest_y = (int) event.getY();
onTrackPad = dbSettings.TRACK_PAD.contains(dest_x, dest_y);
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
if (onTrackPad)
{
//move character
}
break;
case MotionEvent.ACTION_DOWN:
// Fire bullets
break;
}
//The event was consumed
return true;
}
问题是我无法同时移动和开火(我需要停止移动才能开火,反之亦然)
我知道 Android can handle multi-touch events 但还没有弄清楚如何使用它来同时处理这些事件,以便玩家可以同时移动和开火
我也尝试过使用 getActionMasked
但运气不好
MotionEvent 包含您需要的有关触摸的所有信息。您可以通过执行 event.getPointersCount()
来获取触摸次数,并尝试检查 MotionEvent.ACTION_POINTER_2_DOWN
而不是 MotionEvent.ACTION_DOWN
。要获取每个触摸的坐标,您可以使用 event.getX(0)
和 event.getX(1)
,y
也是如此。如果你有一个 MotionEvent.ACTION_MOVE
的案例,有 2 次触摸,你将在你的动作事件中收到所有这些信息。
看完这个问题Android MotionEvent.getActionIndex() and MultiTouch
我就是这样解决问题的
public boolean onTouch(View v, MotionEvent event) {
int dest_x ;
int dest_y ;
p = event.getActionIndex() ;
dest_x = (int) event.getX(p);
dest_y = (int) event.getY(p);
onTrackPad = dbSettings.TRACK_PAD.contains(dest_x, dest_y);
action = event.getActionMasked() ;
switch (action) {
case MotionEvent.ACTION_MOVE:
if (onTrackPad)
{
//move character
}
break;
case MotionEvent.ACTION_DOWN:
// Fire bullets
break;
}
//The event was consumed
return true;
}
试试下面的代码。
当多个指针触摸屏幕时,系统会生成动作 events.we 可以使用指针 ID 跟踪运动事件中的各个指针。指针 ID 在触摸事件中持续存在,并且还允许在整个手势中跟踪单个指针。
@Override
public boolean onTouch(View v, MotionEvent event) {
int index = event.getActionIndex();
int pointerID = event.getPointerId(index);
int action = event.getActionMasked();
if(event.getPointerCount() > 1)
{
Log.i("TouchType ", "Multi Touch");
for(int i = 0; i < event.getPointerCount(); i++)
{
performAction(action);
}
}else
{
Log.i("TouchType ", "Single Touch");
performAction(action);
}
return true;
}
public void performAction(int action){
switch(action)
{
case MotionEvent.ACTION_DOWN :
Log.i("OnTouch ", "Pressed");
// Fire bullets
break;
case MotionEvent.ACTION_MOVE :
Log.i("OnTiouch", "move");
//move character
break;
case MotionEvent.ACTION_UP :
Log.i("OnTiouch", "Up");
break;
default:
Log.i("OnTiouch", "None");
}
}
我正在开发一款游戏,我需要能够检测到一根手指正在执行移动,而另一根手指可能会触摸屏幕的另一部分。
使用下面的代码我可以检测到 ACTION_MOVE(在屏幕的特定区域)和 ACTION_DOWN
public boolean onTouch(View v, MotionEvent event) {
final int dest_x = (int) event.getX();
final int dest_y = (int) event.getY();
onTrackPad = dbSettings.TRACK_PAD.contains(dest_x, dest_y);
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
if (onTrackPad)
{
//move character
}
break;
case MotionEvent.ACTION_DOWN:
// Fire bullets
break;
}
//The event was consumed
return true;
}
问题是我无法同时移动和开火(我需要停止移动才能开火,反之亦然)
我知道 Android can handle multi-touch events 但还没有弄清楚如何使用它来同时处理这些事件,以便玩家可以同时移动和开火
我也尝试过使用 getActionMasked
但运气不好
MotionEvent 包含您需要的有关触摸的所有信息。您可以通过执行 event.getPointersCount()
来获取触摸次数,并尝试检查 MotionEvent.ACTION_POINTER_2_DOWN
而不是 MotionEvent.ACTION_DOWN
。要获取每个触摸的坐标,您可以使用 event.getX(0)
和 event.getX(1)
,y
也是如此。如果你有一个 MotionEvent.ACTION_MOVE
的案例,有 2 次触摸,你将在你的动作事件中收到所有这些信息。
看完这个问题Android MotionEvent.getActionIndex() and MultiTouch
我就是这样解决问题的
public boolean onTouch(View v, MotionEvent event) {
int dest_x ;
int dest_y ;
p = event.getActionIndex() ;
dest_x = (int) event.getX(p);
dest_y = (int) event.getY(p);
onTrackPad = dbSettings.TRACK_PAD.contains(dest_x, dest_y);
action = event.getActionMasked() ;
switch (action) {
case MotionEvent.ACTION_MOVE:
if (onTrackPad)
{
//move character
}
break;
case MotionEvent.ACTION_DOWN:
// Fire bullets
break;
}
//The event was consumed
return true;
}
试试下面的代码。 当多个指针触摸屏幕时,系统会生成动作 events.we 可以使用指针 ID 跟踪运动事件中的各个指针。指针 ID 在触摸事件中持续存在,并且还允许在整个手势中跟踪单个指针。
@Override
public boolean onTouch(View v, MotionEvent event) {
int index = event.getActionIndex();
int pointerID = event.getPointerId(index);
int action = event.getActionMasked();
if(event.getPointerCount() > 1)
{
Log.i("TouchType ", "Multi Touch");
for(int i = 0; i < event.getPointerCount(); i++)
{
performAction(action);
}
}else
{
Log.i("TouchType ", "Single Touch");
performAction(action);
}
return true;
}
public void performAction(int action){
switch(action)
{
case MotionEvent.ACTION_DOWN :
Log.i("OnTouch ", "Pressed");
// Fire bullets
break;
case MotionEvent.ACTION_MOVE :
Log.i("OnTiouch", "move");
//move character
break;
case MotionEvent.ACTION_UP :
Log.i("OnTiouch", "Up");
break;
default:
Log.i("OnTiouch", "None");
}
}