2012-12-04 1 views
8

터치 이벤트의 마스킹과 관련된 몇 가지 작은 질문이 있습니다. 나는 여기에서 그리고 다른 곳에서 많은 것을 읽었지만, 여전히 약간 혼동 스럽다.Android 멀티 터치 및 getActionMasked()

1)가

2) 위의 두 명령 이상 그 event.getAction() 혼자 모든 정보 등을 제공합니다 삼성 S2와 HTC 욕망)에있을 표시 (event.getAction() & MotionEvent.ACTION_MASK 같은 event.getActionMasked()인가, 아니면 다른 .

3) 어디서 만지고 어떤 pointerId로 포인터가 사용되는지 또는 포인터가 사용 중이 아닌지 간단하게 말하는 코드 조각을 작성했습니다 (현재 두 번만 쓴다). 위에서 언급 한 장치에서 올바르게 작동하는 것으로 보이지만 일부 장치는 절대적으로 올바르게 수행되지 않으면 매우 다르게 작동 할 수 있습니다. 따라서 다음 내용이 정확하고 모든 장치에서 작동하는지 궁금합니다.

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

답변

16

일부 배경 -

정수는 getAction에서 반환은 포장 작업 코드를 모두 인코딩 정수 (예를 들어, ACTION_DOWN) 및 포인터 인덱스 (예를 들어, 손가락)입니다.

싱글 터치의 경우 손가락이 하나만 포함되어 있으므로 포인터 인덱스를 저장할 필요가 없으므로 값은 동작 코드입니다. 그러므로 무언가를하는 것이 안전합니다 getAction() == ACTION_DOWN

멀티 터치의 경우이 비교는 패키지 정수에 여분의 포인터 인덱스가있는 경우가 잘못되었습니다. 당신은 당신의 질문에 이제

getAction() & ACTION_POINTER_INDEX_MASK를 수행하여 포인터 인덱스를 getAction() & ACTION_MASK를 수행하여 액션 코드를 추출하고 추출 할 수 있습니다 -

1 : 예. getActionMasked을 동작 코드 비트를 추출하는 도우미 메서드로 생각하십시오. 포인터 인덱스를 추출하려면 getActionIndex 도우미 메서드가 있어야합니다. 이 두 가지 방법 모두 단일 또는 다중 터치로 작동하므로 "가장 안전한"방법입니다.

2 : 코드에서 버그가 : 전술 한 바와 같이, getAction 또한 멀티 터치

3 포인터 인덱스를 암호화한다. event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK))은 기술적으로 올바르지 않습니다. 대신 당신은해야한다 event.getPointerId(event.getActionIndex()). 매우 운이 좋은 getActionIndex의 부정확 한 논리와 연산자는 2 바이트가되고 마스크는 2 바이트 (0xff)입니다.

+0

뛰어난 설명! – George