Add*_*dev 23 java android android-layout android-resources
想象一下有4个按钮的布局
_______________________________
| | |
| A | B |
|______________|________________|
| | |
| C | D |
|______________|________________|
Run Code Online (Sandbox Code Playgroud)
我想检测整个布局上的投掷手势,但是当投掷开始时,没有检测到按钮.
我正在使用:
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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
当没有可点击的项目时,如果从可点击的项目开始投掷则失败.
我怎么解决这个问题?提供50分的赏金,以获得完整的工作答案
Tre*_*vor 27
我实现此目的的一种方法是覆盖以下方法:
public boolean onInterceptTouchEvent(MotionEvent event){
super.onInterceptTouchEvent(event);
...
Run Code Online (Sandbox Code Playgroud)
您可以覆盖在你的布局容器这种方法(如ViewGroup中,或任何你拿着用按钮),并继续返回false从它以正由孩子消耗"拦截"触摸事件ViewS(即您的按钮).在该重写方法中,您可以使用MotionEvents 调用您的手势检测器对象.这种方法也"看到"以ViewGroup自身为目标的事件,这意味着 - 如果我没记错的话 - 你只需要在该方法中调用你的手势探测器,并且这样做手势探测器将"看到" 所有事件,无论他们是否超过按钮.因此,如果您从一个按钮开始拖动手指然后在布局背景上的某个点结束,则手势检测器应该看到整个滑动.您不需要使用布局自己的事件来提供手势检测器,onTouchEvent()因为它已经看过它们.
第二种方式:
我只是看着我使用它的项目,并意识到我改用了另一种方式.我实际上做的是我设计了我的所有孩子View,使得父Activity(或包含ViewGroup)可以向所有这些孩子注册相同的手势检测器对象View(我的每个孩子View都有一个叫做的方法registerGestureDetector()).然后,在我孩子View的重写'onTouchEvent()'中,我将MotionEvents 传递给已经注册的手势检测器View.换句话说,父ViewGroup布局和所有孩子View只是共享相同的手势检测器.
我意识到这可能听起来有点麻烦而且没有必要考虑可以使用onInterceptTouchEvent(),但我的应用程序处理一些非常复杂的规则,关于我View需要如何响应触摸事件和手势,它允许我应用一些我需要特定于我的应用程序的其他逻辑.然而,我使用的这两种方法都达到了相同的基本目标:将目标MotionEvent各种Views 的s 引导到同一个手势检测器对象.