手势覆盖查看和双击

因此,我希望能够使用GestureOverlayView和OnGestureListener识别高级手势,并能够使用GestureDetector检测双击和长按。 我有两个function在两个不同的项目单独工作。 但是,我正试图把它们结合起来,遇到一些问题。 看起来,当我尝试双击/长按,它不被识别,因为GestureOverlayView覆盖整个屏幕,只会识别在手势生成器中定义的高级手势。 有谁知道如何设置GestureOverlayView,以便它将允许GestureDetector做它的工作? 我的代码:

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> 

提前致谢!

Solutions Collecting From Web of "手势覆盖查看和双击"

我做了,但不知道我的解决scheme是否适合你。 你是否需要在整个活动中检测到双击和长按或者只是在你的列表中?

在我的项目中,我拥有的是当然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将传播触摸事件内部视图,而手势没有检测到。 解决scheme是在视图上创build一个touchlistener,您需要使用侦听器onTouch方法上的GestureDetector检测简单的手势。 希望它可以帮助你。

问题来自您的活动的方法onTouchEvent(event),因为该事件被GestureOverlayView截获,所以未被调用。

如果你想在你的活动中获得这个事件,你可能想重载dispatchTouchEvent(event)方法。

在你的情况下,这个代码可能工作:

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

我遇到了同样的问题。

GestureOverlayView正在拦截onTouchEvent。 所以只需设置

 android:eventsInterceptionEnabled="false" 

结果应该是这样的:

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

我遇到了一些问题。 我find了一个解决scheme,但我不知道它为什么工作。

我使用dispathTouchEvent方法,但我用我的GestureDetector实例调用onTouchEvent()。

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