CoordinatorLayout,CollapsingToolbarLayout打造自己的折疊式標題欄

android的折疊式布局好多app都已經(jīng)用了,看起來效果確實很贊,最近項目中也使用了,記錄使用筆記,備忘.

在android studio的模板里面,Scrolling Activity就實現(xiàn)了這個折疊式布局,可以直接看到效果.今天我們就在它的基礎上學習定制自己的折疊效果.
先看下模板里面的xml

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.example.happycodingirl.collapsingtoolbarlayoutdemo.ScrollingActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_scrolling" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email"
        app:layout_anchor="@id/app_bar"
        app:layout_anchorGravity="bottom|end" />

</android.support.design.widget.CoordinatorLayout>
1.其中注意一點:
 android:fitsSystemWindows="true"
這個屬性是為了適應狀態(tài)欄高度.當為true時,會自動給view加一個ppadding,以使view不會擠壓到狀態(tài)欄里面.
需要注意的一點是toolbar沒有設置android:fitSystemWindows="true"默認也就是false.如果也置為true,你會發(fā)現(xiàn)toolbar上方又多出來了一個padding.沒有居中了.
2.可通過在CollapsingToolbarLayout標簽下添加
app:titleEnabled="false"
使toolbar的title固定,而不隨整個布局的拉伸位置下移.

或者在代碼中設置

        collapsingToolbarLayout.setTitleEnabled(false);
3.在我們的應用中需要添加在toolbar下面添加一條線,以使toolbar界限明顯.

最后在根CoordinatorLayout布局下添加View,如下

 <View
        android:layout_marginTop="65dp"
        android:fitsSystemWindows="true"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        app:layout_anchor="@id/toolbar"
        app:layout_anchorGravity="bottom"
        android:background="@android:color/holo_green_dark"
        />

其中marginTop值需要設置為toolbar的高度+statusBar的高度.此處要注意不要忘了寫marginTop,否則該View會壓在toolbar上,別忘了加狀態(tài)欄的高度.(StormZhang在其toolabr適配方案里面也是直接寫死statusBar高度為25dp).其實我還是對寫死的東西有點沒有安全感,一直在疑惑所有手機的statusBar都是25dp嗎,臨時在我手機上顯示都正常.若有知道statusBar高度是否在所有手機上都一樣高的問題的,望賜教.

app:layout_anchor="@id/toolbar"

設置該view以哪個View作為錨點.

app:layout_anchorGravity="bottom"

處于錨點View的下方.

4.collapsingToolbarLayout 標簽下的
app:contentScrim="?attr/colorPrimary"
限定的是toolbar折疊在頂部時的背景色.
5.不要忘記了collapsingToolbarLayout本質上依然是一個FrameLayout,Toolbar必須寫在最后面,否則折疊后被后面添加的布局遮擋了.

我的測試代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.example.happycodingirl.collapsingtoolbarlayoutdemo.ScrollingActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:titleEnabled="false"
            app:contentScrim="@android:color/holo_orange_dark"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:layout_marginTop="40dp"
                android:src="@drawable/sea"
                android:scaleType="fitXY"
                android:layout_gravity="bottom"
                android:fitsSystemWindows="true"
                android:layout_width="match_parent"
                android:layout_height="150dp" />




            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:fitsSystemWindows="false"
                app:navigationIcon="@android:drawable/ic_btn_speak_now"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                app:layout_collapseMode="pin"
                android:gravity="center"
                android:layout_gravity="top"
                android:minHeight="40dp"
                android:background="@android:color/holo_orange_dark"
                app:popupTheme="@style/AppTheme.PopupOverlay" >
                <LinearLayout
                    android:orientation="horizontal"
                    android:layout_gravity="center"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <TextView
                        android:text="toolbar title"

                        android:gravity="center"
                        android:textSize="25dp"
                        android:layout_weight="1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />

                    <ImageView
                        android:gravity="center"
                        android:layout_gravity="right|center"

                        android:layout_width="wrap_content"
                        android:layout_height="40dp"
                        android:src="@android:drawable/ic_search_category_default"/>
                </LinearLayout>



            </android.support.v7.widget.Toolbar>



        </android.support.design.widget.CollapsingToolbarLayout>


    </android.support.design.widget.AppBarLayout>

    <View

        android:layout_marginTop="65dp"
        android:fitsSystemWindows="true"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        app:layout_anchor="@id/toolbar"
        app:layout_anchorGravity="bottom"
        android:background="@android:color/holo_green_dark"
        />

    <include layout="@layout/content_scrolling" />


</android.support.design.widget.CoordinatorLayout>

展開效果:


展開效果

折疊效果:


toolbar顯示正常

在上述xml里面如果將ImageView放到toolbar后面,屬性不變,折疊后的效果如下:


toobar被遮擋
其實toolbar還是在折疊的位置上,只是被上面的imageView遮擋住了.
AppBarLayout 本質上是個LinearLayout,所以可以在CollapsingToolbarLayout和結束標簽后面和AppBarLayout結束標簽前面添加一個TabLayout,toolbar折疊后TabLayout緊貼在toolbar下面吸附的效果.

還有一個非常重要的知識點app:layoutFlags各個值代表的各種效果,下篇博客再寫.
洗洗睡啦,呼呼~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诈闺,隨后出現(xiàn)的幾起案子瘫俊,更是在濱河造成了極大的恐慌,老刑警劉巖卷中,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件政恍,死亡現(xiàn)場離奇詭異氓涣,居然都是意外死亡牛哺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門劳吠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來引润,“玉大人,你說我怎么就攤上這事痒玩〈靖剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵蠢古,是天一觀的道長奴曙。 經(jīng)常有香客問我,道長草讶,這世上最難降的妖魔是什么洽糟? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上坤溃,老公的妹妹穿的比我還像新娘拍霜。我一直安慰自己,他們只是感情好薪介,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布祠饺。 她就那樣靜靜地躺著,像睡著了一般汁政。 火紅的嫁衣襯著肌膚如雪道偷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天烂完,我揣著相機與錄音试疙,去河邊找鬼。 笑死抠蚣,一個胖子當著我的面吹牛,可吹牛的內容都是我干的履澳。 我是一名探鬼主播嘶窄,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼距贷!你這毒婦竟也來了柄冲?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忠蝗,失蹤者是張志新(化名)和其女友劉穎现横,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阁最,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡戒祠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了速种。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姜盈。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖配阵,靈堂內的尸體忽然破棺而出馏颂,到底是詐尸還是另有隱情,我是刑警寧澤棋傍,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布救拉,位于F島的核電站,受9級特大地震影響瘫拣,放射性物質發(fā)生泄漏亿絮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壹无。 院中可真熱鬧葱绒,春花似錦、人聲如沸斗锭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岖是。三九已至帮毁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豺撑,已是汗流浹背烈疚。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留聪轿,地道東北人爷肝。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像陆错,于是被迫代替她去往敵國和親灯抛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容