同时检测父视图和子视图的 Android-Touch 事件

cod*_*lor 5 android touch-event android-layout android-activity

目前以下是我的应用程序的布局:

       LinearLayout
            ----Button
               ----ScrollView
                  ----RelativeLayout
                     ----EditText
Run Code Online (Sandbox Code Playgroud)

我在所有这些之上创建了一个透明的 LinearLayout,实现了 OnTouchListener 并在 OnTouch() 内部,返回 false。因此,所有控件都移动到子级下方。但是在 LinearLayout 上,我无法处理 ACTION_MOVE 操作,因为此布局不消耗 MotionEvent 对象。有什么方法可以检测父视图和子视图中的所有触摸事件吗?

Kar*_*eek 1

dispatchTouchEvent您可以通过覆盖布局来实现这一点。

public class MyFrameLayout extends LinearLayout {
    @Override
    public boolean dispatchTouchEvent(MotionEvent e) {
        // do what you need to with the event, and then...
        return super.dispatchTouchEvent(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用该布局代替通常的 FrameLayout:

    <com.example.android.MyFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="10dip"
        android:id="@+id/rootview">

  ...
Run Code Online (Sandbox Code Playgroud)

如果您需要阻止子视图接收事件,您也可以完全跳过超级调用,但我认为这种情况很少见。

这个答案是基于Romain Guy的答案的参考