24

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

4

1 回答 1

27

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

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

你可以在你的布局容器中覆盖这个方法(例如ViewGroup,或者任何你拿着按钮的东西)并继续false从它返回,以便“拦截”正在被child Views(即你的按钮)消耗的触摸事件。在该覆盖的方法中,您可以使用MotionEvents 调用手势检测器对象。此方法还“看到”以ViewGroup自身为目标的事件,这意味着 - 如果我没记错的话 - 你只需要从该方法中调用你的手势检测器,这样做手势检测器将“看到”所有事件,无论它们是否超出按钮。因此,如果您从按钮开始拖动手指,然后在布局背景上的某个点结束,手势检测器应该会看到整个滑动。您不需要向手势检测器提供来自布局自身的事件,onTouchEvent()因为它已经看到了它们。

第二种方式:

我只是看了看我使用它的项目,并意识到我换了一种不同的方式来做这件事。我实际上所做的是我设计了我所有的 child View,以便父母Activity(或包含ViewGroup)可以向所有这些 child 注册相同的手势检测器对象View(我的每个特殊Views 都有一个名为 的方法registerGestureDetector())。然后,在我的孩子Views 中被覆盖的 'onTouchEvent()' 中,我将MotionEvents 传递给已向其注册的手势检测器View。换句话说,父ViewGroup布局和所有子布局View共享相同的手势检测器。

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

于 2012-02-07T19:00:02.207 回答