1. 程式人生 > >Android使用CoordinatorLayout和BottomSheetBehavior實現滑動效果(底部抽屜)

Android使用CoordinatorLayout和BottomSheetBehavior實現滑動效果(底部抽屜)

因為需要在安卓中實現底部的滑動抽屜效果,然後找了SlidingDrawer、Slidingmenu等等第三方的實現方案,發現基本已經被淘汰了,然後找到了一個官方的側滑選單DrawerLayout,但是這玩意只能側滑。。。還有一個功能非常接近的控制元件——ButtonSheet,但是限制太多,實現複雜。
最後,發現了一個好東西——CoordinatorLayout(這裡是官方文件),是個很新鮮的東西( Google IO/15 大會發布),用來和其他控制元件聯動互動。它的功能很多,這裡就來說說用它的layout_behavior中的BottomSheetBehavior實現滑動抽屜效果。

首先放上XML


主介面和滑動部分的頁面是放在一起的,在你需要滑動的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