2011-07-06 3 views
1

제스처를 거의 소비 할 필요가있는 뷰를 생성 중입니다. 이를 위해 ScaleGestureDetector와 GestureDetector를 만들었습니다. 리스너 클래스 하나를 만들었고 필요한 모든 인터페이스를 구현할 수 있다는 것을 깨달았습니다. 그래서 나는했다. 그들은 같은 클래스에서 온 때문 OnGestureListener 및 OnDoubleTapListener에 대한 총 의미가 있지만 :하나의 OnGestureListener 개체가 두 개의 GestureDetector 개체를 처리 할 수 ​​있습니까?

  • 는 ScaleGestureDetector는 자신의 리스너 클래스를 기대할 것인가?
  • 같은 클래스에 만족하면 자체 개체가 필요합니까?
  • 반대로 두 수신기에서 동일한 수신기를 사용해야합니까?

실험은 다음과 같은 확인했습니다

  • 당신은 참으로 하나 개의 리스너 클래스를 사용할 수 있지만이 같은 이벤트를 소비하는 경우
  • ScaleGestureDetector와 GestureDetector 서로를 성가 시게 할 수 있습니다. 그러나
  • 당신이 항상 일정한 검출기를 실행하기 전에 isInProgress() 메소드를 체크 한 후 첫 번째로 규모 검출기를 호출하여이 상호 irking을 방지 할 수 있습니다 보인다

    public boolean onTouchEvent(MotionEvent event) { 
    //let the ScaleGestureDetector try first 
        mScaleDetector.onTouchEvent(event); 
    //if isInProgress() returns true then it's consuming the event 
        if(mScaleDetector.isInProgress()) return true; 
    //if isInProgress() returns false it isn't consuming the event 
    //it's therefore safe to pass it to the regular detector 
        mPrimaryDetector.onTouchEvent(event); 
        return true; 
    } 
    

답변

2

ScaleGestureDetector 및 GestureDetector 수 이 동일한 이벤트를 사용하는 경우 서로를 괴롭 히십시오. 그러나 그것은 당신이 항상 첫 번째로 규모 검출기를 호출 한 다음 일반 검출기 개인적으로

을 실행하기 전에 의 isInProgress() 메소드를 확인하여이 상호 irking을 방지 할 수 있습니다 것 같다, 나는 그들에게 모두 핸들을 수 있도록함으로써 문제를 발견하지 않았습니다 같은 터치 이벤트.

android GestureDetector에는 constructor이 있으며 부울은 ignoreMultiTouch입니다. ignoreMultiTouchtrue으로 설정하면 GestureDetector 터치 이벤트 처리가 모든 mutitouch 이벤트를 무시합니다. (아마 당신은 명시 적으로 설정할 필요가 없습니다 있도록 대상 API 레벨이> = 프로 요의 경우 안드로이드는 실제로 trueignoreMultiTouch을 설정합니다.)

mPrimaryDetector.onTouchEvent(event)를 호출 할 경우, 때 mScaleDetector.isInProgress() false를 반환, 당신은 잘못을 얻을 것이다 긴 보도 행사. 그 이유는 GestureDetector 그것은 멀티 터치 제스처와 충돌하지 않도록하기 위해 onTouchEvent(MotionEvent ev)에 다음 코드를 가지고 있습니다 :

case MotionEvent.ACTION_POINTER_DOWN: 
    if (mIgnoreMultitouch) { 
    // Multitouch event - abort. 
    cancel(); 
    } 
    break; 

cancel()는 말한다 일을하고 하나의 터치 제스처 삭제됩니다. (실제로 호기심이 있다면 직접 GestureDetector code을 볼 수 있으며 메시지 처리기를 사용하여 실제로 메시지를 보내거나 제거합니다.)

희망 사항은 동일한 문제가있는 사람에게 도움이되기를 바랍니다.

+0

정말 환상적입니다. 감사합니다! 나는'ignoreMultiTouch'에 대해 전혀 몰랐다. –

+0

그건 그렇고, "성가심"의 형태는 "MotionEvent"가 다른 청중을 추락시키는 방식으로 한 청취자 클래스에 의해 변경되는 것처럼 보였습니다. –

+1

@Noel은 ignoreMultiTouch 매개 변수의 이름이 unused로 변경되었으며 더 이상 사용되지 않는 것처럼 보입니다. 이유를 모르겠다. – Flynn81

0

이 나를 위해 잘 작동합니다 :

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    m_sGestureDetector.onTouchEvent(event); 
    m_GestureDetector.onTouchEvent(event); 
    return true; 
} 
+1

'm_sGestureDetector'가'ScaleGestureDetector'라고 가정합니까? 어쨌든, 이것은 스케일 질문자가 이벤트를 소비하는 경우 감지기 사이에'if (mScaleDetector.isInProgress()) true true;를 반환하는 것을 제외하고는 질문의 끝에 포함 된 코드 스 니펫과 같습니다. –

3

단순히 MotionEvent.getPointerCount() > 1를 사용 MotionEvent가 멀티 터치 이벤트인지 여부를 확인합니다. 그래서 다음과 같은 코드가 잘 작동한다고 생각합니다 :

public boolean onTouchEvent(MotionEvent event) { 
    if (event.getPointerCount() > 1) { 
     mScaleDetector.onTouchEvent(event); 
    } else { 
     mDetector.onTouchEvent(event); 
    } 
    return true; 
} 
+0

포인터 개수가 변경되면 어떤 일이 발생하는지는 다루지 않습니다. 최소한 액션별로 필터링해야하며, 멀티 터치 제스처는 포인터가 약간 다른 시간에 자주 움직이는 경우가 많습니다. –

관련 문제