如何防止点击事件和绕过视图滚动事件?

时间:2016-11-13 21:56:01

标签: android

我在NestedScrollView上面有一个RelativeLayout。我想阻止在RelativeLayout上传播任何点击但允许所有滚动事件。 应该使用" controllers_container"将它应用于RelativeLayout。 ID

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        ... content ...

    </android.support.v4.widget.NestedScrollView>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_anchor="@id/scrollView"
        app:layout_anchorGravity="bottom|left|end">

        <RelativeLayout
            android:id="@+id/controllers_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="@dimen/activity_vertical_margin"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_above="@+id/bottom_bar">

            ... content ...

        </RelativeLayout>

        ... content ...

    </RelativeLayout>
</android.support.design.widget.CoordinatorLayout>

添加android:clickable="true"会阻止任何触摸事件,包括滚动。我尝试在scrollView上设置触摸侦听器,但无法根据需要进行管理。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我想出了一种方法。 基本上,我在NestedScrollView处理触摸事件中有一个视图(称之为 targetView )。我创建了一个处理触摸事件的公共方法,如:

public boolean handleTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {

            ... Handle the action up event ...

        }
        return true;
    }

然后,我在父级上设置该视图的触摸侦听器(在这种情况下,包含所有这些元素的片段)。如果操作发生在 controllersContainer 之外,我会调用 handleTouch 方法。

targetView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    int scrollY = nestedScrollView.getScrollY();
                    int top = controllersContainer.getTop();
                    float y = event.getY() + targetView.getTop();
                    if (y - scrollY > top) {
                        return false;
                    }
                }
                return targetView.handleTouch(v, event);
            }
        });