版權聲明:本文為博主原創文章,未經博主允許不得轉載。
目錄(?)[+]
我的簡書同步發布:玩轉AppBarLayout,更酷炫的頂部欄
上一篇文章《CoordinateLayout的使用如此簡單 》對
CoordinateLayout
的使用做了講解,今天我們再講解常常與其一起使用的幾個View
:AppBarLayout
、CollapsingToolbarLayout
以及Toolbar
。一下子出現3個陌生的View
,是不是覺得很慌張~,很多人都寫了這幾個布局的使用,但是他們卻沒有有針對性的單獨講解每個View的作用以及如何使用,我看的很多文章都是一上來就把AppBarLayout
、CollapsingToolbarLayout
以及Toolbar
寫到一個布局里面去,然后一個一個布局屬性去說,一下子感覺好混亂,本文是從Toolbar開始說起,最終讓你把這3個View徹底掌握下來!其實,這三個View都是針對我們以往常用的
ActionBar
的,就是針對我們的App的頂部的Bar玩各種花樣~我們往下看,看看他們把我們的App的”頂部欄”玩出個什么花樣!1 Toolbar
Toobar主要是用來替換ActionBar的,換句話說,ActionBar能做的,Toolbar都能做。如果你對ActionBar的使用比較熟悉,你會發現Toolbar使用起來非常簡單。ok,既然是替換,當然用Toolbar的時候就得先去把ActionBar給隱藏掉啦~
隱藏ActionBar的方法有很多,可以通過代碼的方式隱藏,也可以通過配置文件的方式,我們主要是通過配置文件的方式來隱藏。在我們的styles.xml文件中的APPTheme標簽中加入如下兩行:
<item name="windowActionBar">false</item><item name="windowNoTitle">true</item>1212當然了,你也可以新建一個
<style>
標簽,將上面兩行代碼加入,并且將這個新建的標簽作為<application>
的theme
。還可以選擇通過將AppTheme的parent設置為Theme.AppCompat.Light.NoActionBar
的方式。方法很多,可以自己隨便選。接下來就是將Toolbar放入到布局文件(沒啥好解釋的):
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:background="?attr/colorPRimary" android:layout_height="?android:attr/actionBarSize" />1234512345最后將Toobar作為“ActionBar”來用
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle("這里是Title"); toolbar.setSubtitle("這里是子標題"); toolbar.setLogo(R.drawable.icon); setSupportActionBar(toolbar);123456123456可以對Toolbar設置Logo、標題、子標題等等~還有很多其他的設置,自己去慢慢玩,這里不提啦~。當然了,也可以在布局文件中設置這些,在布局文件設置就不寫啦,hongyang大神有篇博客寫的挺好的《 Android 5.x Theme 與 ToolBar 實戰 》可以去參考一下。
看看效果:
如果Toolbar僅僅是用來對以往的ActionBar做一次替換,那也太沒創意啦!完全沒必要去替換了,因為它們表現出來的都是一樣的,而且并沒有讓我們覺得用起來比ActionBar方便。那為啥要替換呢,總應該有他的理由吧:ActionBar是固定在頂部,并不能移動,我覺得這是最大的不好,而我們的ToolBar可以讓我們隨便擺放,就就可以帶來很多靈活性和效果啦!
正如你所看的這樣,Toolbar根本就不夠看的,一點都不復雜。接下來我們繼續學習在Toolbar上面再套一層父View,讓Toolbar更有互動性。
2 AppBarLayout
AppBarLayout繼承自LinearLayout,布局方向為垂直方向。所以你可以把它當成垂直布局的LinearLayout來使用。AppBarLayout是在LinearLayou上加了一些材料設計的概念,它可以讓你定制當某個可滾動View的滾動手勢發生變化時,其內部的子View實現何種動作。
請注意:上面提到的某個可滾動View,可以理解為某個ScrollView。怎么理解上面的話呢?就是說,當某個ScrollView發生滾動時,你可以定制你的“頂部欄”應該執行哪些動作(如跟著一起滾動、保持不動等等)。那某個可移動的View到底是哪個可移動的View呢?這是由你自己指定的!如何指定,我們后面說。
2.1 AppBarLayout子View的動作
內部的子View通過在布局中加
app:layout_scrollFlags
設置執行的動作,那么app:layout_scrollFlags
可以設置哪些動作呢?分別如下:(1)
scroll
:值設為scroll
的View會跟隨滾動事件一起發生移動。什么意思呢?簡單的說,就是當指定的ScrollView發生滾動時,該View也跟隨一起滾動,就好像這個View也是屬于這個ScrollView一樣。
一張gif足以說明:
對應的布局文件
<android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?android:attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll" /></android.support.design.widget.AppBarLayout>12345678910111234567891011(2)
enterAlways
:值設為enterAlways
的View,當ScrollView往下滾動時,該View會直接往下滾動。而不用考慮ScrollView是否在滾動。看個動畫片(Y(^o^)Y)(ToolBar高度設為:
?Android:attr/actionBarSize
,app:layout_scrollFlags="scroll|enterAlways"
):
(3)
exitUntilCollapsed
:值設為exitUntilCollapsed
的View,當這個View要往上逐漸“消逝”時,會一直往上滑動,直到剩下的的高度達到它的最小高度后,再響應ScrollView的內部滑動事件。怎么理解呢?簡單解釋:在ScrollView往上滑動時,首先是View把滑動事件“奪走”,由View去執行滑動,直到滑動最小高度后,把這個滑動事件“還”回去,讓ScrollView內部去上滑??磦€gif感受一下(圖中將高度設的比較大:200dp,并將最小高度設置為
?android:attr/actionBarSize
,app:layout_scrollFlags="scroll|exitUntilCollapsed"
):
(4)
enterAlwaysCollapsed
:是enterAlways
的附加選項,一般跟enterAlways
一起使用,它是指,View在往下“出現”的時候,首先是enterAlways
效果,當View的高度達到最小高度時,View就暫時不去往下滾動,直到ScrollView滑動到頂部不再滑動時,View再繼續往下滑動,直到滑到View的頂部結束。來個gif感受一下(圖中將高度設的比較大:200dp,并將最小高度設置為
?android:attr/actionBarSize
,app:layout_scrollFlags="scroll|enerAlways|enterAlwaysCollapsed"
):
2.2 將AppBarLayout與ScrollView關聯起來
前面說了一直反復說“當ScrollView發生滾動時”,那么怎么將AppBarLayout與ScrollView關聯起來呢?我們注意到,AppBarLayout與ScrollView之間動作“相互依賴”,這不就是我們上一篇《CoordinateLayout的使用如此簡單 》所學的內容嗎?把ScrollView和AppBarLayout作為CoordinateLayout的子View,然后編寫一個Behavior,在這個Behavior里面判斷當前的操作是應該讓ScrollView時刻保持在AppBarLayout之下(即只要改變AppBarLayout的位置就可以一起滑動),還是應該讓ScrollView內部滾動而不讓AppBarLayout位置發生變化等等這些需求,都是可以在Behavior里面處理的。你可以去針對你的ScrollView編寫Behavior。然而,我們看到我們的AppBarLayout事先的功能比較復雜,如果我們自己去定義這樣的效果,代碼非常復雜,還要考慮很多方面,好在Android幫我們寫好啦,我們直接用就是了,這個ScrollView就是NestedScrollView,請注意,它并沒有繼承ScrollView,它繼承的是FrameLayout,但是它實現的效果把它可以看成是ScrollView。
把NestedScrollView放入到我們的layout文件里面就可以啦~~~,很方便~
新聞熱點
疑難解答