2017-06-16 173 views
0

我的应用程序中有一个问题,需要根据一个手指或两个手指按下时执行不同的操作。Android 2手指触摸触发1个手指触摸以及2个手指触摸

目前,我有后续代码:

@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; 
    } 

我遇到的问题是,当我按2个手指,多点触控的部分寄存器,之后也是如此单一的按。

我做了一些谷歌搜索的方式来解决这个问题,这就是为什么我检查单触摸条件,我认为会解决这个问题action != MotionEvent.ACTION_POINTER_DOWN。这并没有解决问题,因此我决定检查event.getPointerCount() == 1,但不幸的是,当我用两根手指按下时仍然会导致两行打印。

总结我只需要调用两个手指部分,而不是两个手指按下。

回答

1

请参阅“Handling Multi-Touch Gestures”的文档。它详细介绍了你正在寻找的东西。

实质上,每个活动指针在与屏幕接触时都被分配一个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; 
    } 
} 
+0

我必须重读上的文件和研究如何去做。我相信你的示例代码是错误的,但是它根本不注册2个手指按压。我认为这是由secondaryPointerId = -1引起的,这意味着多点触摸条件永远不会被满足 – kalenpw

+0

当接收到“MotionEvent.ACTION_POINTER_DOWN”的动作时,应该分配'secondaryPointerId'。我的关于如何引用正确行为指数的机制可能会关闭(我把它写成内存),但要点是正确的。如果'secondaryPointerId' == -1这是因为表面上有一个(或没有)手指。 – hsl

+0

我正在研究它,问题是'事件MotionEvent.ACTION_POINTER_DOWN'从来没有实际进入,我还没有找出原因,但除此之外,我认为这是正确的。我明白你的意思关于secondaryPointerId – kalenpw