自定義Behavior實現(xiàn)Fab上拉隱藏下拉顯示

Behavior

Behavior 只有用在 CoordinatorLayout 的直接子 View 上才有效光戈,他是 CoordinatorLayout 滾動事件的一系列回調(diào)漓拾。

自定義 Behavior 繼承哪個類?

我們找到 CoordinatorLayout.Behavior 類后ctrl+h(as快捷鍵)發(fā)現(xiàn)有很多實現(xiàn)類畦木,現(xiàn)在要實現(xiàn)的是 Fab 按鈕的隱藏和顯示,仔細尋找后發(fā)現(xiàn)在眾多實現(xiàn)類中有一個 FloatingActionButton.Behavior 过牙,他就是要繼承的實現(xiàn)類愕宋。

自定義 Behavior 的實現(xiàn)

首先要繼承FloatingActionButton.Behavior

public class MyBehavior extends FloatingActionButton.Behavior {
    public MyBehavior(Context context, AttributeSet attrs) {
        super();
    }
}

這里有個重要的地方:自定義 Behavior 繼承 FloatingActionButton.Behavior 之后要重寫他有兩個參數(shù)的構(gòu)造方法埋市,這是因為 Behavior 是 CoordinatorLayout 的內(nèi)部類, CoordnatorLayout 是通過反射來從布局文件里面我們定義的 Behavior 屬性創(chuàng)建 Behavior 的煞肾,創(chuàng)建時調(diào)用的構(gòu)造方法就是那個帶兩個參數(shù)的構(gòu)造方法咧织。

然后實現(xiàn)里面重要的三個方法

// 頁面開始滑動。
boolean onStartNestedScroll(CoordinatorLayout l, FloatingActionButton c, View directTargetChild, View v, int nestedScrollAxes);

// 頁面正在滑動籍救。
void onNestedScroll(CoordinatorLayout l, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed);

// 頁面停止滑動
onStopNestedScroll();

onStartNestedScroll

CoordinatorLayout里的滾動控件開始滾動的時候被調(diào)用习绢,這個方法的最后一個參數(shù)表示當前頁面的滾動方向是橫向還是垂直的,現(xiàn)在要監(jiān)聽的是垂直方向的滾動蝙昙,故判斷這個值是否是ViewCompat.SCROLL_AXIS_VERTICAL闪萄,如果是則返回true,當前滾動的方向是我們需要監(jiān)聽的

boolean onStartNestedScroll(CoordinatorLayout l, FloatingActionButton c, View directTargetChild, View v, int nestedScrollAxes){
    return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL;
}

onNestedScroll

頁面滾動時被調(diào)用(手指觸摸屏幕開始移動時奇颠,只要手指移動就會調(diào)用败去,當然,這取決于onStartNestedScroll的返回值烈拒,比如手指在橫向滑動圆裕,但是onStartNestedScroll返回false,那么這個方法不會被調(diào)用荆几,只有當onStartNestedScroll返回true這個方法才會被調(diào)用葫辐,而onStartNestedScroll的返回值取決于你需要監(jiān)聽的方向),我們就在這個方法中實現(xiàn)Fab的顯示/隱藏伴郁,這個方法接收七個參數(shù),前三個參數(shù)不用介紹了蛋叼,重點介紹后面四個參數(shù)

  • int dxConsumed
    • 當頁面在橫向方向有滑動的時候(不是手指的滑動焊傅,是頁面上的像素點在x方向發(fā)生的變化),這個值就會變化狈涮。比如當頁面向右滑動(x的正方向)狐胎,滑動多少個點這個值就是多少
  • int dxUnconsumed
    • 頁面滑動到頂或滑動到底手指還在滑動,這個值就會變化歌馍,當頁面滑動到底手指還在上拉握巢,這個值就會出現(xiàn)負值,值的大小取決于滑動到底后再向上拉的長度

dyConsumed和dyUnconsumed同上面兩個道理相同松却,只是用于y軸(垂直方向)暴浦。
我們現(xiàn)在要實現(xiàn)的是頁面向上滾動時Fab隱藏溅话,頁面向下滾動時Fab顯示。所以我們需要用到的是dyConsumeddyUnconsumed這兩個參數(shù)

public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        //頁面向上滑動像素數(shù)大于0 || 拉到底還在向上拉 && 退出動畫是否正在執(zhí)行 && FAB按鈕當前顯示中
        if ((dyConsumed > 0 || dyUnconsumed > 0) && !isAnimatingOut && child.getVisibility() == View.VISIBLE) {
            //隱藏Fab
            child.hide(); 
        } else if ((dyConsumed < 0 || dyUnconsumed < 0) && child.getVisibility() != View.VISIBLE) {
            //顯示Fab按鈕
            child.show();
        }
    }

在這段代碼中我們通過判斷界面的滾動和當前Fab的顯示隱藏狀態(tài)來做相應的操作歌焦,在這里Fab有自己的顯示隱藏功能飞几,如果是其他View需要自己寫動畫相關(guān)的代碼。

onStopNestedScroll

Fab的顯示和隱藏的動畫已經(jīng)在 onNestedScroll 方法中實現(xiàn)了独撇,所以這個方法在這里不再贅述屑墨。

最后

到這里,一個自定義的用于Fab按鈕的Behavior就寫完了纷铣。
只需要在xml代碼中給Fab按鈕寫如下屬性卵史,即可使用

<android.support.design.widget.FloatingActionButton
       ......
        app:layout_behavior="包名.MyBehavior" />

當然,F(xiàn)ab按鈕的父容器得是CoordinatorLayout

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搜立,一起剝皮案震驚了整個濱河市以躯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儒拂,老刑警劉巖寸潦,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異社痛,居然都是意外死亡见转,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門蒜哀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斩箫,“玉大人,你說我怎么就攤上這事撵儿〕丝停” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵淀歇,是天一觀的道長易核。 經(jīng)常有香客問我,道長浪默,這世上最難降的妖魔是什么牡直? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮纳决,結(jié)果婚禮上碰逸,老公的妹妹穿的比我還像新娘。我一直安慰自己阔加,他們只是感情好饵史,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般胳喷。 火紅的嫁衣襯著肌膚如雪湃番。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天厌蔽,我揣著相機與錄音牵辣,去河邊找鬼。 笑死奴饮,一個胖子當著我的面吹牛纬向,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戴卜,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逾条,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了投剥?” 一聲冷哼從身側(cè)響起师脂,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎江锨,沒想到半個月后吃警,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡啄育,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年酌心,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挑豌。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡安券,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氓英,到底是詐尸還是另有隱情侯勉,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布铝阐,位于F島的核電站址貌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏徘键。R本人自食惡果不足惜芳誓,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啊鸭。 院中可真熱鬧,春花似錦匿值、人聲如沸赠制。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钟些。三九已至烟号,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間政恍,已是汗流浹背汪拥。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篙耗,地道東北人迫筑。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像宗弯,于是被迫代替她去往敵國和親脯燃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容