????????AppbarLayout是Material Design的一個(gè)控件,目的是為了實(shí)現(xiàn)一些酷炫到爆的效果,比如之前的折疊導(dǎo)航欄可以費(fèi)勁心血的寫出來,現(xiàn)在利用Appbarlayout非常容易的就可以實(shí)現(xiàn)出來,當(dāng)然需要配合其他幾個(gè)來控件實(shí)現(xiàn),這個(gè)我們待會(huì)再說.
最最簡單用法
? ? ? ? 最最簡單的用法,你可以用他來包裹一個(gè)Toolbar來用,如下圖,這是一個(gè)沒有被包裹的ToolBar,很簡單

? ? ? ? 然后下圖是一個(gè)被包裹的ToolBar

????顏色是默認(rèn)的(你color文件中定義的colorPrimary顏色),最主要的是浮層效果,立體感的效果,這是你只是用toolbar沒有的效果,當(dāng)然如果這個(gè)幅度太大,你先調(diào)小或者不要,可以在AppbarLayout中設(shè)置,如下:


app:expanded="true"? 這個(gè)屬性是配合CoordinatorLayout來使用的
正經(jīng)用法
然后我們就來學(xué)習(xí)一下這個(gè)控件的正經(jīng)用法,其實(shí)他的最主要特點(diǎn)是滑動(dòng),他需要配合倆個(gè)控件一起使用,那就是 CoordinatorLayout和CollapsingToolbarLayout。
CoordinatorLayout
官方文檔的第一句話就非常醒目:CoordinatorLayout is a super-powered FrameLayout,非常直白,CoordinatorLayout 繼承于ViewGroup,它就是一個(gè)超級(jí)強(qiáng)大Framelayout。說白了就是可以通過Behavior 協(xié)調(diào)子View 。
CollapsingToolbarLayout
官方文檔的介紹
CollapsingToolbarLayout is a wrapper for?Toolbar?which implements a collapsing app bar. It is designed to be used as a direct child of a?AppBarLayout.?
CollapsingToolbarLayout是一個(gè)包裝Toolbar,實(shí)現(xiàn)了一個(gè)折疊的應(yīng)用程序欄。它的目的是作為一個(gè)直接的孩子使用AppBarLayout
他能實(shí)現(xiàn)一下效果:
折疊標(biāo)題
當(dāng)布局完全可見時(shí)更大的標(biāo)題,但隨著布局滾動(dòng)屏幕而折疊并變小。您可以將標(biāo)題設(shè)置為通過顯示setTitle(CharSequence)。標(biāo)題外觀可以通過collapsedTextAppearance和expandedTextAppearance屬性進(jìn)行調(diào)整。
內(nèi)容蒙紗
滾動(dòng)位置達(dá)到一定閾值時(shí)顯示或隱藏內(nèi)容。你可以通過改變這個(gè)setContentScrim(Drawable)。
狀態(tài)欄蒙紗
當(dāng)滾動(dòng)位置已經(jīng)達(dá)到一定的閾值時(shí),狀態(tài)欄顯示或隱藏。你可以通過改變這個(gè)setStatusBarScrim(Drawable)。
視差滾動(dòng)
子視圖可以選擇以視差方式在此布局內(nèi)滾動(dòng)。
固定位置的view
子View可以選擇全局固定在空間。這在實(shí)現(xiàn)折疊時(shí)非常有用,因?yàn)?a target="_blank" rel="nofollow">Toolbar即使布局正在移動(dòng),它也可以固定到位。
結(jié)合使用
AppbarLayout要實(shí)現(xiàn)酷炫的滑動(dòng)效果必須依賴于CoordinatorLayout使用,作為CoordinatorLayout的直接子view,如果父view是其他的viewGroup是沒有效果的.滑動(dòng)的特效用如下倆種方式設(shè)置
setScrollFlags
app:layout_scrollFlags
layout_scrollFlags有5種動(dòng)作,分別是scroll,enterAlways,enterAlwaysCollapsed,exitUntilCollapsed,snap
1,scroll,子View 添加layout_scrollFlags屬性 的值scroll 時(shí),這個(gè)View將會(huì)隨著可滾動(dòng)View(如:ScrollView,以下都會(huì)用ScrollView 來代替可滾動(dòng)的View )一起滾動(dòng),就好像子View 是屬于ScrollView的一部分一樣。


????注意:ScrollFlags是設(shè)置給AppbarLayout的子View的,他可以有很多子View,你給那個(gè)子View設(shè)置,那個(gè)子View就會(huì)有效果,如下圖,我們有倆個(gè)ToolBar,一個(gè)設(shè)置ScrollFlags,一個(gè)沒有設(shè)置.

2,enterAlways,子View 添加layout_scrollFlags屬性 的值有enterAlways 時(shí), 當(dāng)ScrollView 向下滑動(dòng)時(shí),子View 將直接向下滑動(dòng),而不管ScrollView 是否在滑動(dòng)。注意:要與scroll 搭配使用,否者是不能滑動(dòng)的。

注意:這一看跟scroll沒啥區(qū)別啊,scroll是作為類似于一個(gè)header的形式存在的,當(dāng)你歡動(dòng)view的時(shí)候他會(huì)跟著一起往上滑,當(dāng)先往下滑額時(shí)候他也會(huì)往下滑,直到view滑倒底部,他才會(huì)出現(xiàn),而enterAlways是作為一個(gè)導(dǎo)航欄的東西,雖然向上滑動(dòng)的時(shí)候它也會(huì)向上滑動(dòng),但他只是滑出界面,當(dāng)你view向下滑動(dòng)的時(shí)候,即使view已經(jīng)滑動(dòng)到底部,它也會(huì)立即滑動(dòng)出來,而不會(huì)像單純的scroll一樣必須view滑倒頭部才出來。
3,enterAlwaysCollapsed, enterAlwaysCollapsed 是對(duì)enterAlways 的補(bǔ)充,當(dāng)ScrollView 向下滑動(dòng)的時(shí)候,滑動(dòng)View(也就是設(shè)置了enterAlwaysCollapsed 的View)下滑至折疊的高度,當(dāng)ScrollView 到達(dá)滑動(dòng)范圍的結(jié)束值的時(shí)候,滑動(dòng)View剩下的部分開始滑動(dòng)。這個(gè)折疊的高度是通過View的minimum height (最小高度)指定的。

注意:app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
必須這樣三個(gè)一起用才會(huì)有想要的效果, enterAlwaysCollapsed是 enterAlways擴(kuò)展, enterAlways又必須依賴于 scroll,你可以 enterAlwaysCollapsed和 scroll用,但是只有scroll的效果
4,exitUntilCollapsed, 當(dāng)ScrollView 滑出屏幕時(shí)(也就時(shí)向上滑動(dòng)時(shí)),滑動(dòng)View先響應(yīng)滑動(dòng)事件,滑動(dòng)至折疊高度,也就是通過minimum height 設(shè)置的最小高度后,就固定不動(dòng)了,再把滑動(dòng)事件交給 scrollview 繼續(xù)滑動(dòng)。

注意:exitUntilCollapsed是獨(dú)立的,只依賴scroll,當(dāng)然你可以和enterAlways或者enterAlwaysCollapsed一起用,但是效果還是以exitUntilCollapsed為主,并且效果會(huì)有一絲的卡頓和古怪,所以應(yīng)該沒人這么干
5,snap,意思是:在滾動(dòng)結(jié)束后,如果view只是部分可見,它將滑動(dòng)到最近的邊界。比如,如果view的底部只有25%可見,它將滾動(dòng)離開屏幕,而如果底部有75%可見,它將滾動(dòng)到完全顯示。

注意:這個(gè)效果其實(shí)就是類似我們側(cè)拉菜單的一個(gè)效果,可以回彈。還有這個(gè)效果是可以和其他幾個(gè)一起使用的,效果即使幾個(gè)的結(jié)合如下圖:


????????以上便是appbarlayout五種scrollFlag的特效介紹,基本可以滿足日常開發(fā)需要,如果設(shè)計(jì)師比較鬼畜,那么打他?。。?/p>
其他方法介紹
addOnOffsetChangedListener當(dāng)AppbarLayout 的偏移發(fā)生改變的時(shí)候回調(diào),也就是子View滑動(dòng)。
getTotalScrollRange返回AppbarLayout 所有子View的滑動(dòng)范圍
removeOnOffsetChangedListener移除監(jiān)聽器
setExpanded (boolean expanded,? boolean animate)設(shè)置AppbarLayout 是展開狀態(tài)還是折疊狀態(tài),animate 參數(shù)控制切換到新的狀態(tài)時(shí)是否需要?jiǎng)赢?/p>
setExpanded (boolean expanded)設(shè)置AppbarLayout 是展開狀態(tài)還是折疊狀態(tài),默認(rèn)有動(dòng)畫
但看解釋好像不明白,我們詳細(xì)來看一下這幾個(gè)方法
1,addOnOffsetChangedListener
這是官方的解釋,其實(shí)很明白了
Called when theAppBarLayout's layout offset has been changed. This allows child views to implement custom behavior based on the offset (for instance pinning a view at a certain y value).
在AppBarLayout的布局偏移量發(fā)生改變時(shí)被調(diào)用。這個(gè)方法允許子view根據(jù)偏移量實(shí)現(xiàn)自定義的行為(比如在特定Y值的時(shí)候固定住一個(gè)View)
下面來舉個(gè)例子來看一下這個(gè)方法能作甚們
如圖我們搞一個(gè)這個(gè)樣子的布局



????????可見當(dāng)appbarlayout最大的時(shí)候偏移量為0,網(wǎng)上滑動(dòng)的時(shí)候,偏移量向負(fù)數(shù)方向增大,下面是效果圖,只是展示了可以做的一些事情,實(shí)際項(xiàng)目中可以根據(jù)偏移量隨意操作,比如可以做個(gè)透明度的動(dòng)畫等等

2,getTotalScrollRange,這個(gè)方法返貨的是一個(gè)滑動(dòng)的范圍,也可以理解為黨appbarlayout滑動(dòng)到最小值時(shí)候的一個(gè)值得絕對(duì)值,這個(gè)值是不變的,是以appbarlayout為基礎(chǔ)的其所有子view的一個(gè)范圍值,如下,我們在addOnOffsetChangedListener方法中加入以下代碼,然后滑動(dòng)得到的值全都是288。有這個(gè)方法,我們可以在addOnOffsetChangedListener方法中做什么事情之前做一個(gè)精準(zhǔn)的判斷。


3,removeOnOffsetChangedListener? ,移除監(jiān)聽器,這個(gè)沒什么好說的,移除掉偏移量監(jiān)聽,某些情況下,你可能需要根據(jù)偏移量做些神門事情,但是某些情況下,你有不想做神門,所以只好把他移除掉。
4,setExpanded (boolean expanded, boolean animate)設(shè)置AppbarLayout 是展開狀態(tài)還是折疊狀態(tài),animate 參數(shù)控制切換到新的狀態(tài)時(shí)是否需要?jiǎng)赢?/b>
setExpanded (boolean expanded)設(shè)置AppbarLayout 是展開狀態(tài)還是折疊狀態(tài),默認(rèn)有動(dòng)畫
這倆個(gè)方法,就像他的解釋一樣


CollapsingToolbarLayout?
CollapsingToolbarLayout是對(duì)子view的包裝,并且實(shí)現(xiàn)了折疊app bar效果,使用時(shí),要作為 AppbarLayout 的直接子View。
1,Collapsing title(折疊標(biāo)題)當(dāng)布局全部可見的時(shí)候,title 是最大的,當(dāng)布局開始滑出屏幕,title 將變得越來越小,你可以通過setTitle(CharSequence) 來設(shè)置要顯示的標(biāo)題。
注意:Toolbar 和CollapsingToolbarLayout 同時(shí)設(shè)置了title時(shí),不會(huì)顯示Toolbartitle而是顯示CollapsingToolbarLayout 的title,如果要顯示Toolbar 的title,你可一在代碼中添加如下代碼:
collapsingToolbarLayout.setTitle("")
注意:你得給CollapsingToolbarLayout設(shè)置一個(gè)值,你來個(gè)wrap_parent是不起作用的,或者你把toolbar設(shè)置一個(gè)值來撐大CollapsingToolbarLayout也是不可以的


2,Content scrim(內(nèi)容紗布)當(dāng)CollapsingToolbarLayout滑動(dòng)到一個(gè)確定的閥值時(shí)將顯示或者隱藏內(nèi)容紗布,可以通過setContentScrim(Drawable)來設(shè)置紗布的圖片。


3,Status bar scrim(狀態(tài)欄紗布)當(dāng)CollapsingToolbarLayout滑動(dòng)到一個(gè)確定的閥值時(shí),狀態(tài)欄顯示或隱藏紗布,你可以通過setStatusBarScrim(Drawable)來設(shè)置紗布圖片。
4,Pinned position children(固定子View的位置)子View可以固定在全局空間內(nèi),這對(duì)于實(shí)現(xiàn)了折疊并且允許通過滾動(dòng)布局來固定Toolbar 這種情況非常有用。在xml 中將collapseMode設(shè)為pin


5,Parallax scrolling children(有視差地滾動(dòng)子View)讓CollapsingToolbarLayout 的子View 可以有視差的滾動(dòng),需要在xml中用 添加如下代碼:
app:layout_collapseMode="parallax"
注意:app:layout_collapseParallaxMultiplier="0.7" 這個(gè)參數(shù)是設(shè)置視差范圍的,0-1,越大視差越大


????????以上就是appbarlayout的全部特點(diǎn),在項(xiàng)目中使用幾次就會(huì)了,各種scrollFlag與CollapsingToolbarLayout的搭配使用,可以做出很多非??犰诺男Ч?基本滿足各種需求,如果設(shè)計(jì)師太鬼畜,那么打她,打她,打她!!!!!!!? 打不過?請用behavior,behavior,.behavior!!!