Android使用CoordinatorLayout和BottomSheetBehavior实现滑动效果(底部抽屉)

因为需要在安卓中实现底部的滑动抽屉效果,然后找了SlidingDrawer、Slidingmenu等等第三方的实现方案,发现基本已经被淘汰了,然后找到了一个官方的侧滑菜单DrawerLayout,但是这玩意只能侧滑。。。还有一个功能非常接近的控件——ButtonSheet,但是限制太多,实现复杂。
最后,发现了一个好东西——CoordinatorLayout(这里是官方文档),是个很新鲜的东西( Google IO/15 大会发布),用来和其他控件联动交互。它的功能很多,这里就来说说用它的layout_behavior中的BottomSheetBehavior实现滑动抽屉效果。

首先放上XML

Android使用CoordinatorLayout和BottomSheetBehavior实现滑动效果(底部抽屉)_第1张图片

主界面和滑动部分的页面是放在一起的,在你需要滑动的view里面加上

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
这么一行就让界面带上了滑动效果。但是这样是不够的,首先要知道,BottomSheet是有这几个状态的:
STATE_DRAGGING, STATE_SETTLING, STATE_EXPANDED, STATE_COLLAPSED,  STATE_HIDDEN.
分别是拖拽中,静止,拉伸,折叠,隐藏(没有官方的翻译,大致意思是这样的)
如果只是单纯加上了这条属性,没有添加其他控制方法的话,你会发现如果手滑让它隐藏了,你就再也见不到你的抽屉了!

所以我们要加上这两条属性:

app:behavior_hideable="false"
app:behavior_peekHeight="150dp"
第一条使它不可隐藏,第二条使它能露出一点点让你拖动。
到此为止效果是实现了,但是会出现一个小bug,如果抽屉弹出后下方是有按钮的,那么即使看不见也能被触发。。。

所以,就要通过BottomSheetBehavior的回调函数控制按钮的状态,回避这个bug

behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if(newState==STATE_EXPANDED){
            button.setClickable(false);
        }
        if(newState==STATE_COLLAPSED){
            button.setClickable(true);
        }
    }
    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
 
    }
});
以上。
PS:安卓所有依赖包的版本号:https://developer.android.google.cn/topic/libraries/support-library/revisions.html

你可能感兴趣的:(Android)