我在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上设置触摸侦听器,但无法根据需要进行管理。有什么想法吗?
答案 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);
}
});