检测可点击项目的投掷手势

想象一下带有4个按钮的布局

_______________________________ | | | | A | B | |______________|________________| | | | | C | D | |______________|________________| 

我想检测整个布局上的投掷手势,但是当投掷开始时,没有检测到按钮。

我在用着:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); gesturedetector= new GestureDetector(this, this); findViewById(R.id.touchContainer).setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.e("","TouchEvent"); return gesturedetector.onTouchEvent(event); } }); } 

当没有可点击的项目时,如果从可点击的项目开始投掷则失败。

我怎么解决这个问题? 提供50分的赏金,以获得完整的工作答案

Solutions Collecting From Web of "检测可点击项目的投掷手势"

我实现此目的的一种方法是覆盖以下方法:

 public boolean onInterceptTouchEvent(MotionEvent event){ super.onInterceptTouchEvent(event); ... 

您可以在布局容器中覆盖此方法(例如ViewGroup,或者您按住按钮的任何内容)并继续从中返回false以便“拦截”子View正在使用的触摸事件(即您的按钮) )。 在该重写方法中,您可以使用MotionEvent调用手势检测器对象。 此方法也“看到”以ViewGroup本身为目标的事件,这意味着 – 如果我没记错的话 – 您需要在该方法中调用手势检测器,这样做手势检测器将“看到” 所有事件,无论他们是否超过按钮。 因此,如果您从一个按钮开始拖动手指然后在布局背景上的某个点结束,则手势检测器应该看到整个滑动。 您不需要使用布局自己的onTouchEvent()的事件来提供手势检测器,因为它已经看过它们。

第二种方式:

我只是看着我使用它的项目,并意识到我改用了不同的方式。 我实际上做的是我设计了所有我的子View ,使得父Activity (或包含ViewGroup )可以为所有这些子View注册相同的手势检测器对象(我的每个特殊View都有一个名为registerGestureDetector()的方法) registerGestureDetector() )。 然后,在我的子View重写的’onTouchEvent()’中,我将MotionEvent传递给已在该View注册的手势检测器。 换句话说,父ViewGroup布局和所有子View只是共享相同的手势检测器。

我意识到这可能听起来有点麻烦而且没有必要考虑可以使用onInterceptTouchEvent() ,但我的应用程序处理一些非常复杂的规则,关于我的View如何响应触摸事件和手势,并允许我应用一些我需要特定的额外逻辑来应用我的应用程序。 但是,我使用的这两种方法都达到了相同的基本目标:将目标各种ViewMotionEvent引导到同一个手势检测器对象。