2012-12-04 17 views
8

Ben dokunmatik olayların maskeleme ile yapmak için bir bazı küçük sorum var. Burada ve başka yerlerde pek çok şey okudum ama yine de parçalarla biraz karıştım.Android çok noktalı dokunma ve getActionMasked()

1) onlar

2) Yukarıdaki iki komutlar fazla olduğunu event.getAction() yalnız olacak tüm bilgi ve verecek Samsung S2 ve HTC Desire) gibi görünen (event.getAction() & MotionEvent.ACTION_MASK aynı event.getActionMasked() mi, yoksa farklı .

3) ediliyor dokunma ve hangi pointerId veya işaretçi yalnızca şu anda iki dokunuşlar için yazılmış simgeler (değilse) diyor basit bir kod peice yazdım. Yukarıda belirtilen cihazlarda düzgün çalışıyor gibi görünüyor, ancak bazı cihazların kesinlikle doğru yapılmadığı takdirde çok farklı hareket edebileceğini biliyorum. Bu yüzden aşağıdakilerin doğru olup olmadığını merak ediyorum ve tüm cihazlarda davranacağım.

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; 
} 

cevap

16

Bazı dosyaları -

tamsayı getAction dönen bir dolu hareket kodunu hem kodlayan tam sayıdır (örn ACTION_DOWN) ve işaretçi indeksi (örneğin parmak) 'dir. olmadığından tek dokunuş için

, yalnızca bir parmak değeri sadece aksiyon kodudur böylece işaretçi indeksi saklamak için gerek yoktur içeriyordu. Bu nedenle, getAction() == ACTION_DOWN gibi bir şey yapması güvenlidir Çoklu temas için, bu karşılaştırma yanlış b/c paketli tamsayıda fazladan işaretçi dizinine sahiptir. Eğer soruya Şimdi

getAction() & ACTION_POINTER_INDEX_MASK yaparak işaretçi endeksi getAction() & ACTION_MASK yaparak eylem kodunu elde ve ayıklayabilirsiniz -

1: Evet. düşünmek eylem kodu bitlerini çıkarmak bir yardımcı bir yöntem olarak getActionMasked. işaretçi endeksi ayıklamak için, eşdeğer getActionIndex yardımcı yöntem var. Her iki yöntem de tek veya çoklu temas için çalışacak, dolayısıyla "en güvenli".

2: kodunda bir hata vardır: Yukarıda açıklandığı gibi, getAction da çok noktalı dokunma

3 için işaretçi endeksini kodlar. event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK)) teknik olarak yanlıştır. Bunun yerine event.getPointerId(event.getActionIndex()) yapıyor olmalı. çok şanslı ile yanlış mantıksal ve işleç 2 byte olduğu ortaya çıktığında getActionIndex ve maskenin kendisi 2 bayttır (0xff) :)

+0

Mükemmel açıklama! – George

İlgili konular