OnTouch事件如何表现?

时间:2013-01-07 17:39:23

标签: android multi-touch

如果设备上有多个手指,onTouch-listener是否会为每个手指运行一次,或者每个事件运行一次(手指向下,移动等等)并包含每个活动的触摸指针?

如果

(e.getAction() & MotionEvent.ACTION_MASK == MotionEvent.ACTION_MOVE)

我如何知道当前哪个指针正在移动?

final int pointerIndex = e.getActionIndex();
pointerID = e.getPointerId(pointerIndex);

由于某种原因,总是返回0(而MotionEvent.ACTION_MOVE)..

1 个答案:

答案 0 :(得分:3)

首先,你得到这些事件:

  1. MotionEvent.ACTION_DOWN
    对于屏幕上的第一次触摸
  2. MotionEvent.ACTION_POINTER_DOWN
    适用于所有非主要接触
  3. MotionEvent.ACTION_UP
    最后一次修饰
  4. MotionEvent.ACTION_POINTER_UP
    对于每次非主要的修饰
  5. MotionEvent.ACTION_MOVE
    每当触摸手指的任何人移动时 在这里你必须通过所有的方法并检查坐标是否已经改变
  6. 这样做:

    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
        final int action = ev.getAction();
        final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; //index of this pointer
    
        switch (action & MotionEvent.ACTION_MASK)
        {
            case MotionEvent.ACTION_DOWN:
                //your first touch on the screen
                break;
    
            case MotionEvent.ACTION_MOVE:
                //one of the touches has moved
                for (unsigned int i = 0; i < ev.getPointerCount(); i++)
                {
                    //The pointer id is ev.getPointerId(i);
                    //for loop through all touches
                }
                break;
    
            case MotionEvent.ACTION_UP:
                //your last touch has gone up
                break;
    
            case MotionEvent.ACTION_POINTER_DOWN:
                //non-primary pointer has gone down
                break;
    
            case MotionEvent.ACTION_POINTER_UP:
                //non-primary pointer has gone up
                break;
            }
        }
    
        return true;
    }
    

    我希望这会对你有所帮助:)。