nat*_*rio 54 android ontouchlistener touch-event android-support-library android-support-design
v. 23.2引入了设计支持库BottomSheetBehavior,它允许协调员的子节点作为底部工作表(可从屏幕底部拖动的视图).
我想做的是作为底层视图,具有以下视图(典型的协调器+折叠的东西):
<CoordinatorLayout
app:layout_behavior=“@string/bottom_sheet_behavior”>
<AppBarLayout>
<CollapsingToolbarLayout>
<ImageView />
</CollapsingToolbarLayout>
</AppBarLayout>
<NestedScrollView>
<LinearLayout>
< Content ... />
</LinearLayout>
</NestedScrollView>
</CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)
不幸的是,底部工作表视图应该实现嵌套滚动,否则它们不会获得滚动事件.如果您尝试使用主活动然后将此视图作为底部工作表加载,您将看到滚动事件仅作用于纸张的"工作表",并且有一些奇怪的行为,您可以看到是否继续阅读.
我很确定这可以通过子类化来处理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;
}
Run Code Online (Sandbox Code Playgroud)毋庸置疑,我现在无法完成这项工作.当条件得到满足时,我无法捕捉事件,而在其他情况下则无法捕获它们.在下图中,您可以看到标准CoordinatorLayout会发生什么:
如果向下滚动应用栏,则表单将被关闭,但如果向下滚动嵌套内容则不会.嵌套滚动事件似乎不会传播到协调器行为;
内部appbar也存在问题:嵌套滚动内容在折叠时不会跟随appbar.
在工作表内正确显示appbars/scroll视图的行为;
当工作表展开时,它可以在向下滚动时折叠,但前提是内部应用栏也完全展开.现在它崩溃而不考虑appbar状态,只有你拖动appbar;
折叠工作表时,向上滚动手势将展开它(对内部应用栏没有影响).
联系人应用程序中的一个示例(可能不使用BottomSheetBehavior,但这是我想要的):
我终于发布了我的实现.在Github或直接从jcenter 找到它:
compile 'com.otaliastudios:bottomsheetcoordinatorlayout:1.0.0’
Run Code Online (Sandbox Code Playgroud)
您所要做的就是使用BottomSheetCoordinatorLayout底部工作表的根视图.它会自动为自己夸大工作行为,所以不要担心.
我已经使用了很长时间了,它不应该有滚动问题,支持拖动ABL等.
| 归档时间: |
|
| 查看次数: |
9030 次 |
| 最近记录: |