将BottomSheetBehavior与内部CoordinatorLayout一起使用

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.

在此输入图像描述

在github上设置了一个示例项目来显示这些问题.

为了清楚起见,期望的行为是:

  • 在工作表内正确显示appbars/scroll视图的行为;

  • 当工作表展开时,它可以在向下滚动时折叠,但前提是内部应用栏也完全展开.现在它崩溃而不考虑appbar状态,只有你拖动appbar;

  • 折叠工作表时,向上滚动手势将展开它(对内部应用栏没有影响).

联系人应用程序中的一个示例(可能不使用BottomSheetBehavior,但这是我想要的):

在此输入图像描述

nat*_*rio 5

我终于发布了我的实现.在Github或直接从jcenter 找到它:

compile 'com.otaliastudios:bottomsheetcoordinatorlayout:1.0.0’
Run Code Online (Sandbox Code Playgroud)

您所要做的就是使用BottomSheetCoordinatorLayout底部工作表的根视图.它会自动为自己夸大工作行为,所以不要担心.

我已经使用了很长时间了,它不应该有滚动问题,支持拖动ABL等.