4

嗨,我正在尝试检测 2 个手指何时触摸屏幕:

   case MotionEvent.ACTION_POINTER_2_DOWN: {

    twoFing=true;
    return true;
}

问题是:

public static final int ACTION_POINTER_2_DOWN

已弃用,医生说:

* getActionMasked() 的常量:非主指针已关闭。使用 getActionIndex() 检索更改的指针的索引。索引在 getAction() 返回的未屏蔽操作的 ACTION_POINTER_INDEX_MASK 位中编码。*

但我不明白如何使用它......我怎么能检测到有 2 个指针?如果我尝试 getPointerIndex(),ActionUP 和 Down 总是说只有一个指针

多谢

编辑:我在这里发布完整的代码以更清楚地了解问题。我的代码正在工作,但是因为 ACTION_POINTER_2_DOWN 是一个已弃用的值,我想用其他东西替换它,但我不知道如何。

@SuppressWarnings("deprecation")
public boolean onTouch(View v, MotionEvent event) {

switch(event.getAction()){

case MotionEvent.ACTION_DOWN : {
     Log.i(TAG, "Action Down");
    downX = event.getX(0);
    downY = event.getY(0);
    return true;
}

case MotionEvent.ACTION_UP: {


    upX = event.getX(0);
    upY = event.getY(0);

    float deltaX = downX - upX;
    float deltaY = downY - upY;
    Log.i(TAG, "Action UP deltaX="+deltaX+", deltaY="+deltaY);



    // swipe vertical?
    if(Math.abs(deltaY) > MIN_DISTANCE && twoFing){
        twoFing=false;

        // top or down
        if(deltaY < 0 ) 
        { 
            if(slide.zoom==1) 
            slide.zoom=0; 
        Log.i(TAG, "Going Down zooming in");
            //return true; 
        }
        if((deltaY > 0) )
        { 

            if(slide.zoom==0) 
                slide.zoom=1;  
            Log.i(TAG, "Going up zoomig out");
            //return true;
        }

        return true;
    }
    // swipe horizontal?
  if(Math.abs(deltaX) > MIN_DISTANCE && !twoFing){

        // left or right
        if(deltaX < 0) { this.slideToTheLeft(); return true; }
        if(deltaX > 0) { this.slideToTheRight(); return true; }
        return true;
    }

  return false;
}

case MotionEvent.ACTION_POINTER_2_DOWN: {

    twoFing=true; //inform that the touch was made with 2 fingers
    Log.i(TAG, "Action Second pointer down");

    return true;
}
}
return false;

}

4

3 回答 3

8

我现在正在自己研究指针的东西。你想切换如下

 switch(event.getAction() & MotionEvent.ACTION_MASK);
     case MotionEvent.ACTION_POINTER_DOWN:

ACTION_DOWN 大约是第一根手指向下。ACTION_POINTER_DOWN 大约是第二根手指。

请参阅http://www.vogella.com/articles/AndroidTouch/article.html以获得相当清晰的描述。

于 2013-11-22T23:52:19.840 回答
2

MotionEvent.ACTION_DOWN仅适用于第一个指针。GetActionMasked() 将为后续指针返回MotionEvent.ACTION_POINTER_DOWN

于 2013-03-17T18:17:21.733 回答
0

您是否尝试过getPointerId(index)使用不同的值index

查看Id和Index的区别:

索引与 ID

在更高的层次上,来自时间快照的触摸屏数据可能不会立即有用,因为触摸手势涉及跨越许多运动事件的随时间的运动。指针索引不一定在复杂事件中匹配,它仅指示数据在 MotionEvent 中的位置。但是,这不是您的应用程序必须自己完成的工作。每个指针还有一个 ID 映射,该映射在触摸事件中保持不变。您可以使用 MotionEvent.getPointerId(index) 为每个指针检索此 ID,并使用 MotionEvent.findPointerIndex(id) 查找指针 ID 的索引。

最好的解决方案应该是保存所有指针的状态并更新/比较它们,您会收到一个新的 TouchEvent。

检查这个例子

于 2012-07-24T14:12:01.740 回答