2012-07-24 111 views
2

你好我想,当两个手指触摸屏幕来检测:Android的触摸事件指针向下

case MotionEvent.ACTION_POINTER_2_DOWN: { 

    twoFing=true; 
    return true; 
} 

的问题是:

public static final int ACTION_POINTER_2_DOWN 

被depreceted时,医生说:

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

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

非常感谢

编辑:我在这里发布完整的代码是关于这个问题更加清晰。我的代码正在工作,但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; 

}

回答

0

你尝试用getPointerId(index)不同值index

参见ID和索引之间的差值:

指数与ID

在一个较高的水平,从在时间快照触摸屏数据可能不能立即 有用的,因为触摸手势涉及随着时间的推移运动 跨越许多运动事件。指针索引不一定匹配跨越复杂事件,它仅指示MotionEvent中的数据位置 。然而,这不是你的应用必须自己做的 。每个指针还有一个ID映射,该映射在整个触摸事件中始终保持为 。您可以使用MotionEvent.getPointerId(index)使用 检索每个指针的ID,并使用MotionEvent.findPointerIndex(id)为指针ID 查找索引。

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

检查这个example

+0

我只从第一个指针(0)获取数据,因为我不需要精确的数据。我只需要检测到第二个手指也被按下(case MotionEvent.ACTION_POINTER_2_DOWN :),然后我设置了一个变量,然后在动作上我的逻辑检测是否有2个手指或1,但我需要替换ACTION_POINTER_2的东西其他..... – vallllll 2012-07-24 14:21:58

+0

我很确定你必须触发'case MotionEvent.ACTION_DOWN',然后检查检索PointerId。 您的设备是否真的支持多点触控? – Hartok 2012-07-24 14:42:17

0

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

3

我正在自己的指针工作。你想要切换如下

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

ACTION_DOWN是关于第一个手指向下。 ACTION_POINTER_DOWN是关于第二根手指。

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