Android,通过点击小部件的手势

我的应用程序包含一个充满button的区域。 我希望以这样的方式实现这个活动,在button区域上的扔手势将把它切换到另外两个区域中的一个(使用ViewFlipper)。

我已经做了两种检测手势的方法。 第一个涉及使用GestureDetector。 但是,button上的触摸动作事件并未引发onTouchEvent活动方法,因此 – 结果 – 我无法将其转发到GestureDetector类。 总之失败了。

第二种方法 – 涉及使用GestureOverlayView。 然而,这一次,我已经到了第二个极端:不仅手势被检测到,而且执行手势的button也报告了一个点击。

我希望界面按以下方式工作:如果用户触摸button并释放触摸(或仅移动一点手指),则button报告点击并且没有检测到手势。 另一方面,如果用户触摸屏幕并进行较长时间的移动,则应该检测手势,并且没有button报告的点击事件。

我已经实现了一个小的概念certificate应用程序。 活动XML代码如下所示:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"> <android.gesture.GestureOverlayView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/overlay"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/display" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/button"/> </LinearLayout> </android.gesture.GestureOverlayView> </LinearLayout> 

活动java代码如下:

 package spk.sketchbook; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.gesture.*; import android.gesture.GestureOverlayView.OnGestureListener; public class Main extends Activity implements OnGestureListener, OnClickListener { private void SetupEvents() { GestureOverlayView ov = (GestureOverlayView)findViewById(R.id.overlay); ov.addOnGestureListener(this); Button b = (Button)findViewById(R.id.button); b.setOnClickListener(this); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SetupEvents(); } @Override public void onGesture(GestureOverlayView arg0, MotionEvent arg1) { TextView tv = (TextView)findViewById(R.id.display); tv.setText("Gesture"); } @Override public void onGestureCancelled(GestureOverlayView arg0, MotionEvent arg1) { } @Override public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) { } @Override public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) { } @Override public void onClick(View v) { TextView tv = (TextView)findViewById(R.id.display); tv.setText("Click"); } } 

问题是:如何实现这样一个界面,可以决定,如果用户操作应被视为手势或button点击?

最好的问候 – 幽灵。

Solutions Collecting From Web of "Android,通过点击小部件的手势"

解决了我自己。 这个想法是捕捉来自GestureOverlayView的手势事件,除了将它们传递给GestureDetector之外,还可以测量用户手势的距离。 距离应存储在私人活动的字段(因此可用于所有事件处理程序)。 最后,扔和点击处理程序应该检查这个字段的值; 如果低于一定的数值​​(比如10个像素就可以),则应该解释为点击。 否则 – 作为一个手势。

请注意,该button将看起来被点击,其点击处理程序将被调用。 我已经决定创build一个底层的点击处理程序(连接到GestureOverlayView上的所有button),执行手势/点击检查,如果结果是点击,则select一个高级点击处理程序。

该解决scheme适用于我; 然而,如果想要禁用button的单击外观并防止处理程序被调用,则可能涉及重新定义button和/或GestureOverlayView组件。

其他解决scheme:使这个function:

 public void SetSwipe(View v, final GestureDetector gestureScanner){ // Sets scroll view listener v.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureScanner.onTouchEvent(event)) return true; else return false; } }); } 

并按如下所示为每个Widget调用它:

 scfSetTag.SetSwipe(svAllView, gestureScanner); 

如果你需要从许多活动或片段中获得这个,你可以创build一个class.java文件,并在你需要实现的每个活动上实例化这个类。 这可以检测到任何witdget点击。 希望有帮助!