2011-02-08 5 views
9

GestureOverlayView 및 OnGestureListener를 사용하여 고급 제스처를 인식하고 GestureDetector를 사용하여 이중 탭 및 긴 누름을 감지 할 수 있기를 바랍니다. 두 가지 기능이 두 가지 프로젝트에서 별도로 잘 작동합니다. 그러나, 나는 그들을 결합하려고하고 몇 가지 문제가 실행됩니다. 더블 탭/길게 누를 때 GestureOverlayView가 전체 화면을 덮고 Gesture Builder에 정의 된 고급 제스처 만 인식하기 때문에 인식되지 않습니다. 누구든지 GestureDetector가 그 일을 할 수 있도록 GestureOverlayView를 설정하는 방법을 알고 있습니까? 내 코드 :GestureOverlayView 및 두 번 누르기

public class HelloAndroid extends Activity implements OnGesturePerformedListener, OnDoubleTapListener, OnGestureListener { 
/** Called when the activity is first created. */ 
private GestureLibrary mLibrary; 
private GestureDetector detector; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); 
    if (!mLibrary.load()) { 
     finish(); 
    } 

    GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures); 
    gestures.addOnGesturePerformedListener(this); 

    detector = new GestureDetector(this, this);\ 

하고 XML ... 사전에

<?xml version="1.0" encoding="utf-8"?> 

<android.gesture.GestureOverlayView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/gestures" 
     android:layout_width="fill_parent" 
     android:visibility="invisible" 
     android:layout_height="fill_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
    <TextView 
     android:id="@+id/text1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" 
     /> 
    </LinearLayout>  
</android.gesture.GestureOverlayView> 

감사합니다!

답변

3

나는 해냈다.하지만 내 솔루션이 효과가 있는지 확신 할 수 없다. 전체 활동 또는 목록에있는 두 번 살짝 누르거나 길게 누르기를 감지해야합니까?

내 프로젝트에서 내가 가진 것은 GestureOverlayView가 모든 것을 래핑하는 것이지만 내 GestureDetector는 해당 이벤트를 처리하려는 컨테이너, 특히 축소판 그림이있는 컨테이너에만 지정되었습니다.

사실, 내 제스처 검출기는

그럼 난 그냥 내 그리드에이 터치 리스너를 할당 할 필요가 View.OnTouchListener

public class TouchListener implements View.OnTouchListener { 

    Rect rect = new Rect(); 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     gestureDetector.onTouchEvent(event); 
     // We do not use the return value of 
     // mGestureDetector.onTouchEvent because we will not receive 
     // the "up" event if we return false for the "down" event. 
    // false is returned so children views can receive touch event too. 
     return false; 
} 

    private View getViewAt(int x, int y) { 
    // I need to know which thumbnail was selected 
    } 

    GestureDetector gestureDetector = new GestureDetector(new SimpleOnGestureListener() { 
     @Override 
     public void onLongPress(MotionEvent e) {…} 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) {…} 
     @Override 
     public boolean onDoubleTap(MotionEvent e) {...} 

}); 

}에 내부입니다. 귀하의 경우 귀하의 목록에 사용될 수 있습니다.

mGrid.setOnTouchListener(new TouchListener()); 

GesturOverlayView는 제스처가 감지되지 않는 동안 터치 이벤트를 내부보기로 전달합니다. 해결책은 listener onTouch 메서드에서 GestureDetector를 사용하여 간단한 제스처를 감지해야하는 경우에 touchListener를 만드는 것입니다. 희망이 당신을 도울 수 있습니다.

+0

이것은 실제로 효과가 있습니다. 고맙습니다 ! –

0

이벤트는 GestureOverlayView에 의해 가로 채어지기 때문에 호출되지 않은 활동의 onTouchEvent (이벤트)에서 발생합니다.

활동에서이 이벤트를 받으려면 dispatchTouchEvent (event) 메소드를 대체 할 수 있습니다. 귀하의 경우에는

,이 코드가 작동 할 수 있습니다

@Override 
public boolean dispatchTouchEvent(MotionEvent e) 
{ 
    detector.onTouchEvent(e); 

    return super.dispatchTouchEvent(e); 
} 
0

저도 같은 문제가되었다.

GestureOverlayView가 onTouchEvent를 가로 채고 있습니다.

<android.gesture.GestureOverlayView 
     android:id="@+id/gestures" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:eventsInterceptionEnabled="false" > 
0

나는 몇 가지 문제가 있었다 : 그래서 그냥 이런 식으로 뭔가를해야

android:eventsInterceptionEnabled="false" 

결과를 설정합니다. 솔루션을 찾았지만 왜 작동하는지 잘 모릅니다.

dispathTouchEvent 메서드를 사용하지만 내 GestureDetector 인스턴스로 onTouchEvent()를 호출합니다.

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) 
{ 
    this.myGestureDetector.onTouchEvent(ev); 
    return super.dispatchTouchEvent(ev); 
}