[英]Android 2 finger touch triggering 1 finger touch as well as 2 finger touch
我的应用程序出现问题,我需要根据是按下一个手指还是两个手指来执行其他操作。
目前,我有以下代码:
@Override
public boolean onTouchEvent(MotionEvent event){
int touchX = (int)event.getX();
int touchY = (int)event.getY();
int action = event.getActionMasked();
//Multitouch
if(event.getPointerCount() > 1 && action == MotionEvent.ACTION_POINTER_DOWN){
System.out.println("2 Finger press");
return true;
}
else if(action == MotionEvent.ACTION_DOWN && action != MotionEvent.ACTION_POINTER_DOWN){
if(event.getPointerCount() == 1) {
System.out.println("single finger down");
invalidate();
return true;
}
}
return false;
}
我遇到的问题是,当我用两根手指按下时,多点触摸部件会注册,然后按下一次。
我在解决该问题的方式上进行了一些搜索,这就是为什么我要检查以单触为条件的action != MotionEvent.ACTION_POINTER_DOWN
,我认为这可以解决问题。 那不能解决问题,因此我决定检查event.getPointerCount() == 1
,但是不幸的是,当我用两根手指按下时,仍然导致两行都打印出来。
总而言之,我只需要在按下2个手指时才调用2个手指部分,而不是两个都叫。
请参阅“ 处理多点触摸手势 ”文档。 它详细说明了您要查找的内容。
本质上,每个活动指针在与屏幕接触时都会分配一个ID。 您的解决方案应考虑哪些ID起作用,并通过观察各种操作状态将其删除。
遵循以下原则(但要注意兼容性要求使用诸如getActionIndex()
类的方法):
更新的代码示例
public class MotionActivity extends AppCompatActivity {
private int primaryPointerId = -1;
private int secondaryPointerId = -1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new FrameLayout(this));
}
@Override
public boolean onTouchEvent(MotionEvent event){
int action = event.getActionMasked();
switch(action) {
case MotionEvent.ACTION_DOWN:
primaryPointerId = event.getPointerId(0);
Log.d(getClass().getName(), "Primary pointer ID == [" + primaryPointerId + "]");
break;
case MotionEvent.ACTION_POINTER_DOWN:
secondaryPointerId = event.getPointerId(event.getActionIndex());
Log.d(getClass().getName(), "Secondary pointer ID == [" + secondaryPointerId + "]");
break;
case MotionEvent.ACTION_MOVE:
if(primaryPointerId > -1 && secondaryPointerId > -1) {
Log.d(getClass().getName(), "Two-point touch...");
} else {
Log.d(getClass().getName(), "One-point touch...");
}
break;
case MotionEvent.ACTION_POINTER_UP:
if(event.getPointerId(event.getActionIndex()) == primaryPointerId) {
primaryPointerId = secondaryPointerId;
}
secondaryPointerId = -1;
break;
case MotionEvent.ACTION_UP:
primaryPointerId = -1;
break;
}
return true;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.