检测可点击项目上的抛掷手势

想象一个包含 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

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

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

您可以在布局容器(例如 ViewGroup,或您用来握住按钮的任何内容)中重写此方法,并继续从中返回,以便“拦截”子项(即按钮)正在使用的触摸事件。在该被覆盖的方法中,您可以使用 s 调用手势检测器对象。此方法还“看到”了针对自身的事件,这意味着 - 如果我没记错的话 - 你只需要从该方法中调用你的手势检测器,这样做,手势检测器将“看到”所有事件,无论它们是否超过按钮。因此,如果将手指从按钮上拖动,然后在布局背景上的某个点结束,则手势检测器应看到整个轻扫。您不需要向手势检测器提供布局自己的事件,因为它已经看到了它们。falseViewMotionEventViewGrouponTouchEvent()

第二种方式:

我只是看了一下我使用它的项目,并意识到我切换到了一种不同的方式。我实际上所做的是,我设计了我所有的孩子,以便父级(或包含型)可以与所有这些子级s注册相同的手势检测器对象(我的每个特殊s都有一个名为的方法)。然后,在我的孩子 s 中被覆盖的 'onTouchEvent()' 中,我将 s 传递给已注册到该的手势检测器。换句话说,父布局和所有子布局只是共享相同的手势检测器。ViewActivityViewGroupViewViewregisterGestureDetector()ViewMotionEventViewViewGroupView

我意识到这可能听起来有点麻烦,考虑到可以使用来完成,这不是必要的,但是我的应用程序处理了一些非常复杂的规则,这些规则涉及如何响应触摸事件和手势的需求,它允许我应用一些额外的逻辑,我需要专门针对我的应用程序。但是,我使用的这两种方法在这里实现了相同的基本目标:将针对各种s的s引导到相同的手势检测器对象。onInterceptTouchEvent()ViewMotionEventView


答案 2

推荐