重新認(rèn)識(shí)CoordinatorLayout的自定義Behavior

從認(rèn)識(shí)Behavior開(kāi)始

在新的support design中梭灿,CoordinatorLayout可以說(shuō)是最重要的一個(gè)控件了橄镜,AS在過(guò)去的版本也是推薦了這個(gè)控件用于滑動(dòng)中的布局聯(lián)動(dòng)。 ?CoordinatorLayout給我們帶來(lái)了一種新的事件的處理方式——behavior竟坛,你是不是還記得我們?cè)谑褂肅oordinatorLayout的時(shí)候,一些子view需要聲明這樣的屬性:

示例:

注意到有一條屬性:app:layout_behavior="@string/appbar_scrolling_view_behavior"

當(dāng)時(shí)我不知道這是干嘛的,直接照用就行了够话,后來(lái)發(fā)現(xiàn)這玩意是一個(gè)類(lèi)!而且我們還可以自定義光绕!所以女嘲,今天這篇博客我們首先來(lái)學(xué)習(xí)一下如何自定義Behavior,之后的博客可能會(huì)看一下CoordinatorLayout是怎么處理這個(gè)Behavior的诞帐。

例如上面的appbar_scrolling_view_behavior對(duì)應(yīng)的字符串其實(shí)是android.support.design.widget.AppBarLayout$ScrollingViewBehavior,這個(gè)ScrollingViewBehavior內(nèi)部類(lèi)指定的泛型是View,所以理論上這個(gè)Behavior我們?nèi)魏蔚腣iew都可以使用欣尼,我們?cè)谧远x的時(shí)候,如果不是特殊的行為停蕉,也可以直接指定泛型View愕鼓。

深入理解Behavior類(lèi)中的方法

自定義Behavior首先要知道我們關(guān)心的是哪個(gè)view 把它作為child 也就是app:layout_behavior屬性所在的view,layoutDependsOn用來(lái)確定哪個(gè)view作為dependency慧起,其中

public class CustomBehavior extends CoordinatorLayout.Behavior{}中的泛型表示child的類(lèi)型

在自定義Behavior的時(shí)候菇晃,我們需要關(guān)心的兩組四個(gè)方法,為什么分為兩組呢蚓挤?看一下下面兩種情況

某個(gè)view監(jiān)聽(tīng)另一個(gè)view的狀態(tài)變化磺送,例如大小驻子、位置、顯示狀態(tài)等

某個(gè)view監(jiān)聽(tīng)CoordinatorLayout里的滑動(dòng)狀態(tài)

對(duì)于第一種情況估灿,我們關(guān)心的是:

layoutDependsOn方法:決定哪個(gè)view作為dependent View 如:

layoutDependsOn方法

CoordinatorLayout會(huì)遍歷所有子view崇呵,只要return dependency instanceOf PullRefreshLayout 返回true就表示那個(gè)view是dependency

onDependentViewChanged方法:當(dāng)dependent view變化時(shí)會(huì)調(diào)用,可用來(lái)改變child view馅袁,使child隨dependency 聯(lián)動(dòng)

onDependentViewChanged

對(duì)于第二種情況演熟,我們關(guān)心的是:

onStartNestedScroll方法:在開(kāi)始滾動(dòng)的時(shí)候調(diào)用,用于篩選需要處理的方向司顿,豎直還是水平芒粹,還有一個(gè)與之對(duì)應(yīng)的方法 onStopNestedScroll 在結(jié)束滑動(dòng)的時(shí)候調(diào)用

onStartNestedScroll

onNestedPreScroll方法〈罅铮滑動(dòng)前的預(yù)處理化漆,target表示的是CoordinatorLayout中可以華東的子view 并不一定是dependency。以下例子就是recyclerview

onNestedPreScroll

另外還有一個(gè)方法比較常用钦奋,onNestedPreFling座云,用于兩個(gè)可飛速滑動(dòng)的view的聯(lián)動(dòng),velocityX,velocityY表示速度?

注意:所有方法付材,比如onNestedPreScroll方法和onStopNestedScroll方法都是在手指在屏幕上未離開(kāi)時(shí)的響應(yīng)朦拖,onStopNestedScroll只在手指離開(kāi)屏幕時(shí)調(diào)用一次

((NestedScrollView) child).fling((int)velocityY);就可以

onNestedPreFling

自定義示例

第一種情況 實(shí)現(xiàn)兩個(gè)textview跟隨運(yùn)動(dòng)

構(gòu)造方法

注意一下,帶有參數(shù)的這個(gè)構(gòu)造必須要重載厌衔,因?yàn)樵贑oordinatorLayout里利用反射去獲取這個(gè)Behavior的時(shí)候就是拿的這個(gè)構(gòu)造璧帝。

布局文件

作為dependency的textview代碼

作為child的textview的behavior代碼

效果

總結(jié)

認(rèn)識(shí)behavior的過(guò)程是艱難的,走了不少?gòu)澛犯皇伲韵M髞?lái)者可以輕松些睬隶。網(wǎng)上類(lèi)似的介紹比較雜,需要仔細(xì)甄別页徐,實(shí)踐苏潜。通過(guò)這個(gè)小小栗子,我發(fā)現(xiàn)認(rèn)識(shí)事物都是由淺入深变勇,所以學(xué)習(xí)知識(shí)的時(shí)候也不必操之過(guò)急恤左,看不懂的代碼不要強(qiáng)行閱讀,要多些消化搀绣。

參考引用:

CoordinatorLayout高級(jí)用法-自定義Behavior

Material Design中的CoordinatorLayout和Behavior詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末飞袋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子豌熄,更是在濱河造成了極大的恐慌授嘀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锣险,死亡現(xiàn)場(chǎng)離奇詭異蹄皱,居然都是意外死亡览闰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)巷折,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)压鉴,“玉大人,你說(shuō)我怎么就攤上這事锻拘∮涂裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵署拟,是天一觀的道長(zhǎng)婉宰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)推穷,這世上最難降的妖魔是什么心包? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮馒铃,結(jié)果婚禮上蟹腾,老公的妹妹穿的比我還像新娘。我一直安慰自己区宇,他們只是感情好娃殖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著议谷,像睡著了一般炉爆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柿隙,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天叶洞,我揣著相機(jī)與錄音鲫凶,去河邊找鬼禀崖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛螟炫,可吹牛的內(nèi)容都是我干的波附。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昼钻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掸屡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起然评,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仅财,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后碗淌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盏求,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抖锥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碎罚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磅废。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荆烈,靈堂內(nèi)的尸體忽然破棺而出拯勉,到底是詐尸還是另有隱情,我是刑警寧澤憔购,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布宫峦,位于F島的核電站,受9級(jí)特大地震影響玫鸟,放射性物質(zhì)發(fā)生泄漏斗遏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一鞋邑、第九天 我趴在偏房一處隱蔽的房頂上張望诵次。 院中可真熱鬧,春花似錦枚碗、人聲如沸逾一。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遵堵。三九已至,卻和暖如春怨规,著一層夾襖步出監(jiān)牢的瞬間陌宿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工波丰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壳坪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓掰烟,卻偏偏與公主長(zhǎng)得像爽蝴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纫骑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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