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

时间:2012-02-07 18:13:12

标签: java android android-layout android-resources

想象一下带有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分的赏金以获得完整的工作答案

1 个答案:

答案 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引导到同一个手势检测器对象。