【发布时间】:2016-07-13 19:09:14
【问题描述】:
设计支持库v. 23.2 引入了BottomSheetBehavior,它允许协调器的子级充当底部工作表(可从屏幕底部拖动的视图)。
我想做的是,作为底页视图,以下视图(典型的协调器 + 折叠的东西):
<CoordinatorLayout
app:layout_behavior=“@string/bottom_sheet_behavior”>
<AppBarLayout>
<CollapsingToolbarLayout>
<ImageView />
</CollapsingToolbarLayout>
</AppBarLayout>
<NestedScrollView>
<LinearLayout>
< Content ... />
</LinearLayout>
</NestedScrollView>
</CoordinatorLayout>
不幸的是,底部工作表视图应该实现嵌套滚动,否则它们不会获得滚动事件。如果您尝试使用主要活动,然后将此视图加载为底部工作表,您将看到滚动事件仅作用于“工作表”,并具有一些奇怪的行为,如果您继续阅读,您会看到。
我很确定这可以通过子类化CoordinatorLayout 来处理,或者甚至更好地通过子类化BottomSheetBehavior。你有什么提示吗?
一些想法
-
应该使用
requestDisallowInterceptTouchEvent(),在某些情况下从父级窃取事件:- 当
AppBarLayout偏移量> 0时 - 当
AppBarLayout偏移量 == 0,但我们正在向上滚动(想一想,你会看到)
- 当
第一个条件可以通过在应用内栏设置
OnOffsetChanged获得;-
第二个需要一些事件处理,例如:
switch (MotionEventCompat.getActionMasked(event)) { case MotionEvent.ACTION_DOWN: startY = event.getY(); lastY = startY; userIsScrollingUp = false; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: userIsScrollingUp = false; break; case MotionEvent.ACTION_MOVE: lastY = event.getY(); float yDeltaTotal = startY - lastY; if (yDeltaTotal > touchSlop) { // Moving the finger up. userIsScrollingUp = true; } break; }
问题
不用说,我现在无法完成这项工作。满足条件时我无法捕获事件,而在其他情况下无法捕获它们。在下图中,您可以看到标准 CoordinatorLayout 会发生什么:
如果您在应用栏上向下滚动,工作表将被关闭,但如果您在嵌套内容上向下滚动则不会。嵌套滚动事件似乎没有传播到 Coordinator 行为;
inner appbar也有问题:嵌套的滚动内容在收起时不跟随appbar..
我设置了一个sample project on github 来显示这些问题。
需要明确的是,期望的行为是:
工作表内应用栏/滚动视图的正确行为;
当工作表展开时,它可以在向下滚动时折叠,但只有在内部应用栏也完全展开时。现在它确实会在不考虑 appbar 状态的情况下崩溃,并且只有在您拖动 appbar 时才会崩溃;
当工作表折叠时,向上滚动手势将展开它(对内部应用栏没有影响)。
来自联系人应用程序的示例(可能不使用 BottomSheetBehavior,但这正是我想要的):
【问题讨论】:
-
你的 NestedScrollView 有这个属性吗?
app:layout_behavior="@string/appbar_scrolling_view_behavior" -
@saki_M 是的,请参阅sample project。
-
我认为目前无法嵌套
CoordinatorLayout。不妨看看 Plaid 的 ElasticDragDismissFrameLayout 实现。 -
@nipun.birla 是的,我自己做的。当我有时间时,我会发布我的解决方案
-
我相信我在this sample project 中在这个问题上已经走了很远,使用了启用嵌套滚动子的
CoordinatorLayout和稍微调整的BottomSheetBehavior。看看this commit 看看我的关键变化。您会发现 GIF 说明哪些已经有效,哪些无效。
标签: android android-support-library ontouchlistener touch-event android-support-design