有没有办法去"转发"将事件从一个滚动视图滚动到我的底部工作表,以便在我滚动第一个滚动视图时我的底部工作表开始展开?
考虑这个小应用程序:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int peekHeight = getResources().getDimensionPixelSize(R.dimen.bottom_sheet_peek_height); // 96dp
View bottomSheet = findViewById(R.id.bottomSheet);
BottomSheetBehavior<View> behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setPeekHeight(peekHeight);
}
}
<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:layout_width="match_parent"
android:layout_height="match_parent">
<!-- LinearLayout holding children to scroll through -->
</android.support.v4.widget.NestedScrollView>
<View
android:id="@+id/bottomSheet"
android:layout_width="300dp"
android:layout_height="400dp"
android:layout_gravity="center_horizontal"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior"/>
</android.support.design.widget.CoordinatorLayout>
开箱即用,这很好用。我看到96pp的底页,我可以照常上下滑动。另外,我可以看到我的滚动内容,我可以正常上下滚动。
让我们假设我处于第二张图片中显示的状态。我的NestedScrollView
一直滚动到底部,我的底部工作表已折叠。我希望能够在NestedScrollView
上向上滑动( not 在底部工作表上),并且由于它无法再向前滚动,请使用该滑动手势而不是被发送到底部工作表,以便它开始扩展。基本上,让应用程序的行为就好像我的手势已在底部工作表上执行,而不是滚动视图。
我的第一个想法是查看NestedScrollView.OnScrollChangeListener
,但我无法使其工作,因为它停止在滚动内容的边界处被触发(毕竟,它会侦听滚动改变,当你处于边缘时没有任何改变。
我还看了一下创建我自己的BottomSheetBehavior
子类并尝试覆盖onInterceptTouchEvent()
,但在两个地方遇到了麻烦。首先,我只想在兄弟滚动视图位于底部时捕获事件,我可以这样做,但我现在正在捕获所有事件(使得无法向后滚动兄弟)。其次,private
内的mIgnoreEvents
字段BottomSheetBehavior
阻止了底层实际扩展。我可以使用反射来访问这个字段并防止它阻挡我,但这感觉很邪恶。
编辑:我花了一些时间研究AppBarLayout.ScrollingViewBehavior
,因为这似乎非常接近我想要的(它将一个视图上的滑动转换为另一个视图上的滑动),但这似乎是手动设置偏移逐个像素,底部表格不那么表现。