想象一下带有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分的赏金以获得完整的工作答案
答案 0 :(得分:27)
我实现此目的的一种方法是覆盖以下方法:
public boolean onInterceptTouchEvent(MotionEvent event){
super.onInterceptTouchEvent(event);
...
您可以在布局容器中覆盖此方法(例如ViewGroup,或者您按住按钮的任何内容)并继续从中返回false
,以“拦截”正在消耗的触摸事件孩子View
s(即你的按钮)。在该重写方法中,您可以使用MotionEvent
调用您的手势检测器对象。此方法也“看到”以ViewGroup
本身为目标的事件,这意味着 - 如果我没记错的话 - 你只需 需要在该方法中调用手势检测器,并且这样做,手势探测器将“看到”所有事件,无论他们是否超过按钮。因此,如果您从一个按钮开始拖动手指然后在布局背景上的某个点结束,则手势检测器应该看到整个滑动。您不需要使用布局自己的onTouchEvent()
中的事件来提供手势检测器,因为它已经看过它们。
第二种方式:
我只是看了一下我使用它的项目,并意识到我改用了不同的方式。我实际上做的是设计了我的所有孩子View
,以便父Activity
(或包含ViewGroup
)可以与所有这些孩子{{注册相同的手势检测器对象1}} s(我的每个特殊View
都有一个名为View
的方法。然后,在我的孩子registerGestureDetector()
中重写的'onTouchEvent()'中,我将View
传递给已使用MotionEvent
注册的手势检测器。换句话说,父View
布局和所有子ViewGroup
只是共享相同的手势检测器。
我意识到这可能听起来有点麻烦而且没有必要考虑可以使用View
完成,但我的应用程序处理了一些非常复杂的规则,关于我的onInterceptTouchEvent()
需要如何回应触摸事件和手势,它允许我应用我需要特定的一些额外的逻辑应用程序。但是,我使用的这两种方法都达到了相同的基本目标:将目标各种View
的{{1}} s引导到同一个手势检测器对象。