從認(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)行閱讀,要多些消化搀绣。
參考引用: