美文网首页
【翻译】触摸手势-多点触摸(Handling Multi-Tou

【翻译】触摸手势-多点触摸(Handling Multi-Tou

作者: reezy | 来源:发表于2017-06-19 11:45 被阅读193次

    https://developer.android.com/training/gestures/multi.html

    多点触摸手势就是多个指针(手指)同时触摸屏幕。本课介绍如何检测涉及多个指针的手势。

    跟踪多个指针(Track Multiple Pointers)

    当多个指针同时触摸屏幕时,系统会生成以下触摸事件:

    • ACTION_DOWN 触摸屏幕的第一个指针。启动手势,指针索引始终为0。
    • ACTION_POINTER_DOWN 第一个指针之外的其它进入屏幕的指针。其指针索引由getActionIndex()返回。
    • ACTION_MOVE press手势期间指针发生了更改。
    • ACTION_POINTER_UP 非主指针离开屏幕。
    • ACTION_UP 最后一个指针离开屏幕。

    您通过每个指针的索引和ID跟踪MotionEvent中的各个指针:

    • 索引(Index):MotionEvent将有关每个指针的信息存储在数组中。指针的索引是其在此数组内的位置。用于与指针交互的大多数MotionEvent方法都将指针索引作为参数,而不是指针ID。
    • ID:每个指针还具有一个ID映射,在触摸事件中保持持续,以允许跨整个手势跟踪单个指针

    单个指针在运动事件中出现的顺序是未定义的。因此,指针的索引可以从一个事件改变到下一个事件,但是只要指针保持活动,指针的指针ID就保持不变。使用getPointerId()方法来获取指针的ID,以便在手势中的所有后续运动事件中跟踪指针。然后对于连续的运动事件,使用findPointerIndex()方法来获取该运动事件中给定指针ID的指针索引。例如:

    private int mActivePointerId;
    
    public boolean onTouchEvent(MotionEvent event) {
        ....
        // Get the pointer ID
        mActivePointerId = event.getPointerId(0);
    
        // ... Many touch events later...
    
        // Use the pointer ID to find the index of the active pointer
        // and fetch its position
        int pointerIndex = event.findPointerIndex(mActivePointerId);
        // Get the pointer's current position
        float x = event.getX(pointerIndex);
        float y = event.getY(pointerIndex);
    }
    
    

    获取MotionEvent的动作(Get a MotionEvent's Action)

    您应该始终使用getActionMasked()来获取MotionEvent的动作。
    与旧的getAction()方法不同,它被设计成支持多个指针。
    它返回正在执行的动作,而不包括指针索引位。
    然后,您可以使用getActionIndex()返回与该操作相关联的指针的索引。

    这在下面的代码片段中说明。

    注意:此示例使用MotionEventCompat类。 该类在支持库中。

    int action = MotionEventCompat.getActionMasked(event);
    // Get the index of the pointer associated with the action.
    int index = MotionEventCompat.getActionIndex(event);
    int xPos = -1;
    int yPos = -1;
    
    Log.d(DEBUG_TAG,"The action is " + actionToString(action));
    
    if (event.getPointerCount() > 1) {
        Log.d(DEBUG_TAG,"Multitouch event");
        // The coordinates of the current screen contact, relative to
        // the responding View or Activity.
        xPos = (int)MotionEventCompat.getX(event, index);
        yPos = (int)MotionEventCompat.getY(event, index);
    
    } else {
        // Single touch event
        Log.d(DEBUG_TAG,"Single touch event");
        xPos = (int)MotionEventCompat.getX(event, index);
        yPos = (int)MotionEventCompat.getY(event, index);
    }
    ...
    
    // Given an action int, returns a string description
    public static String actionToString(int action) {
        switch (action) {
    
            case MotionEvent.ACTION_DOWN: return "Down";
            case MotionEvent.ACTION_MOVE: return "Move";
            case MotionEvent.ACTION_POINTER_DOWN: return "Pointer Down";
            case MotionEvent.ACTION_UP: return "Up";
            case MotionEvent.ACTION_POINTER_UP: return "Pointer Up";
            case MotionEvent.ACTION_OUTSIDE: return "Outside";
            case MotionEvent.ACTION_CANCEL: return "Cancel";
        }
        return "";
    }
    

    相关文章

      网友评论

          本文标题:【翻译】触摸手势-多点触摸(Handling Multi-Tou

          本文链接:https://www.haomeiwen.com/subject/llegqxtx.html