Android,可点击小部件上的手势

| 我的应用程序包含一个充满按钮的区域。我希望以这种方式实现该活动,即在按钮区域上的挥动手势会将其切换到其他两个区域之一(使用ViewFlipper)。 我已经采取了两种方法来检测手势。第一个涉及使用GestureDetector。但是,Button上的触摸动作事件并没有引发onTouchEvent活动方法,因此-结果-我无法将其转发给GestureDetector类。简而言之,就是失败。 第二种方法-涉及使用GestureOverlayView。但是,这一次,我达到了第二个极端:不仅检测到手势,而且执行手势的按钮也报告了单击。 我希望该界面以以下方式工作:如果用户触摸按钮并释放触摸(或仅移动手指一点),则该按钮会报告单击,并且未检测到手势。另一方面,如果用户触摸屏幕并进行了较长的移动,则应检测到该手势并且按钮不会报告单击事件。 我已经实现了一个小的概念验证应用程序。活动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\");
  }


}
问题是:如何实现这样的界面,它可以决定是否将用户操作视为手势或按钮单击? 最好的问候-惊吓。     
已邀请:
解决了自己。这个想法是从GestureOverlayView捕获手势事件,并将其传递给GestureDetector,然后测量用户手势的距离。距离应存储在私人活动的字段中(因此可用于所有事件处理程序)。最后,点击和处理程序应检查该字段的值。如果低于某个值(例如10个像素就可以),则应将其解释为点击。否则-作为手势。 请注意,该按钮将看起来都被单击,并且其单击处理程序将被调用。我决定创建一个低级单击处理程序(附加到GestureOverlayView上的所有按钮上),该操作将进行手势/单击检查,如果结果是单击,则选择较高级的单击处理程序之一。 解决方案对我有用;但是,如果希望禁用按钮的单击外观并阻止调用处理程序,则可能需要重新定义按钮和/或GestureOverlayView组件。     
另一个解决方案: 使此功能:
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;  
        }
    });
}
并为每个小部件调用它,如下所示:
scfSetTag.SetSwipe(svAllView, gestureScanner);
如果您需要从许多活动或片段中进行创建,则可以创建class.java文件,并在需要实施滑动的每个活动上实例化此类。 这将检测到两者都滑动了任何部件。  希望对您有所帮助!     

要回复问题请先登录注册