原版解釋請(qǐng)參考google developer的文章
使用CoordinatorLayout只能使用design Library里面的控件來(lái)實(shí)現(xiàn)炫酷的效果紧显,如果你使用的是以前老的控件,那么他和FrameLayout沒(méi)有任何的區(qū)別。
CoordinatorLayout的不同之處在哪里呢,它的不同來(lái)源于CoordinatorLayout.Behaviors,通過(guò)這個(gè)Behavior可以截取觸摸事件葛峻,屏幕插入,測(cè)量尺寸巴比,添加布局术奖,滾動(dòng)嵌套。
創(chuàng)建一個(gè)Behavior:
這里使用的是泛型來(lái)新建Behavior轻绞,當(dāng)然你也可以指定為某個(gè)特定的View類型采记。
Behavior怎么才會(huì)工作呢:
?they need to be attached to a child View of a?CoordinatorLayout?to actually be called. 就是說(shuō)需要附加在CoordinatorLayout的子View上才會(huì)被調(diào)用。
一? :在程序中:當(dāng)你覺(jué)得CoordinatorLayout的每一個(gè)View都需要附加Behavior的時(shí)候使用政勃。Behavior其實(shí)是存放在View的LayoutParams上的唧龄,只有CoordinatorLayout的直接ziView才有存放Behavior的類。這也是為什么Behavior必須聲明在CoordinatorLayout的直接子類上奸远,因?yàn)橹挥蠧oordinatorLayout的直接子View才會(huì)有Behavior-storing 類既棺,它是LayoutParams的一個(gè)子類(Behavior-storing?subclass of LayoutParams)。
在上面的例子中懒叛,使用的是默認(rèn)的無(wú)參構(gòu)造函數(shù)援制,當(dāng)然可以根據(jù)需要來(lái)傳遞自己需要的參數(shù)。
二 :在XML中使用
FancyBehavior(Context context, AttributeSet attrs)?constructor is always the one called芍瑞,意思是說(shuō)在xml里面的這一句調(diào)用的是這個(gè)有參的構(gòu)造函數(shù)構(gòu)造的對(duì)象晨仑。你還可以自定義屬性(attributes)然后從xml的attributeSet中提取出來(lái)——如果你想通過(guò)xml來(lái)定制特殊功能的Behavior這是非常重要的。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?注意:自定義xml屬性的命名的規(guī)范類似于布局xml(layout_naming),自定義Behavior的xml屬性的命名規(guī)范為behavior_prefix.
三 :自動(dòng)附加到自定義控件(其實(shí)就是繼承FrameLayout,再添加個(gè)Behavior)
其實(shí)看到這里洪己,我們也明白了妥凳,其實(shí)CoordinatorLayout其實(shí)就是給FrameLayout添加一個(gè)Behavior,而直接使用系統(tǒng)的CoordinatorLayout其實(shí)就是使用了系統(tǒng)定義的Behavior答捕。(這樣使用調(diào)用的是默認(rèn)的構(gòu)造方法)逝钥。
攔截觸摸事件
攔截觸摸事件是Behavior做的事情之一,我們知道拱镐,其實(shí)所有的Layout都繼承于ViewGroup艘款。在不是CoordinatorLayout的ViewGroup中,攔截觸摸事件都在ViewGroup的子類中進(jìn)行(具體請(qǐng)看ViewGroup事件處理)沃琅。
但是在CoordinatorLayout中哗咆,CoordinatorLayout通過(guò)把ViewGroup的onInterceptTouchEvent()轉(zhuǎn)移到Behavior的onInterceptTouchEvent()中,如果這個(gè)方法返回為true益眉,Behavior將在onTouchEvent()?獲取到所有的touch events晌柬。所有的CoordinatorLayout的子View都不需要知道做什么,這也是為什么SwipeDismissBehavior?能應(yīng)用在所有的View上的原因郭脂。
如果你想阻斷所有的交互年碘,blocksInteractionBelow()?方法返回true即可。阻斷了觸摸事件之后可能還需要有個(gè)不可觸摸的明顯提示展鸡,這就是為什么blocksInteractionBelow()?方法依賴于getScrimOpacity()?的原因屿衅。getScrimOpacity()?返回一個(gè)不為零的數(shù)值并且覆蓋一層顏色在View上,以此來(lái)提示view不可觸摸莹弊,提升用戶體驗(yàn)涤久。