簡體   English   中英

Android多點觸控和getActionMasked()

[英]Android multitouch and getActionMasked()

我有一些關於觸摸事件掩蓋的小問題。 我在這里和其他地方看過很多東西,但我仍然對零件感到困惑。

1) event.getActionMasked()event.getAction() & MotionEvent.ACTION_MASK (它們似乎在Samsung S2和HTC Desire上)

2)上述兩個命令是否會提供所有信息,而不僅僅是那個事件event.getAction()將會是,或者它是不同的。

3)我編寫了一段代碼,簡單地說明了觸摸的位置和指針ID,或指針是否未被使用(目前僅寫入兩次觸摸)。 它似乎在上面提到的設備上正常工作,但是我知道如果沒有完全正確的話,某些設備可以采取非常不同的行為。 因此,我想知道以下是否正確並且將在所有設備上運行。

boolean pointer0down=false, pointer1down=false;
String st="", str0 ="", str1 ="";

public boolean onTouchEvent( MotionEvent event )
{

  if (event.getActionMasked()==MotionEvent.ACTION_UP
        ||event.getActionMasked()==MotionEvent.ACTION_POINTER_UP
        ||event.getActionMasked()==MotionEvent.ACTION_CANCEL)
   {
     if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0)
        pointer0down=false;
     if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1)
        pointer1down=false;
   }

  if (event.getActionMasked()==MotionEvent.ACTION_DOWN
    ||event.getActionMasked()==MotionEvent.ACTION_POINTER_DOWN)
  {
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0)
       pointer0down=true;
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1)
       pointer1down=true;
   }

 if (pointer0down)
    str0="\tx: " + event.getX(0) + "\ty: "+event.getY(0);
 else
    str0="\tNot down";

 if (pointer1down )
    str1="\tx: " + event.getX(1) + "\ty: "+event.getY(1);
 else
    str1="\tNot down";

 st="pointer0:"+str0+"\npointer1:"+str1;

    return true;
} 

一些背景 -

從getAction返回的整數是一個壓縮整數,它對動作代碼(例如ACTION_DOWN)和指針索引(例如哪個手指)進行編碼。

對於單點觸摸,由於只涉及一個手指,因此不需要存儲指針索引,因此值只是動作代碼。 因此可以安全地執行getAction() == ACTION_DOWN

對於多點觸摸,這種比較是不正確的b / c你在打包的整數中有額外的指針索引。 您可以通過執行getAction() & ACTION_MASK來提取操作代碼,並通過執行getAction() & ACTION_POINTER_INDEX_MASK提取指針索引

現在問你的問題 -

1:是的。 getActionMasked視為提取動作代碼位的輔助方法。 要提取指針索引,您將獲得等效的getActionIndex輔助方法。 這兩種方法都適用於單次或多次觸摸,因此它們是“最安全的”。

2:如上所述,getAction還編碼多點觸控的指針索引

3:您的代碼中存在錯誤。 event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK))在技​​術上是不正確的。 相反,你應該做event.getPointerId(event.getActionIndex()) 很幸運 getActionIndex上的邏輯和運算符不正確,結果是2個字節,掩碼本身就是2個字節(0xff):)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM