CoordinatorLayout和AppBarLayout

一.什么是CoordinatorLayout

CoordinatorLayout是Android官方在Design包提供的控件

CoordinatorLayout:協(xié)調(diào)者布局,用來(lái)組織內(nèi)部的子view之間的協(xié)作的一個(gè)view。繼承自ViewGroup。作為Material Design風(fēng)格的重要組件,CoordinatorLayout(協(xié)調(diào)布局)協(xié)調(diào)多種組件的聯(lián)動(dòng),實(shí)現(xiàn)各種復(fù)雜的效果,在實(shí)際項(xiàng)目中扮演著越來(lái)越重要的角色。

CoordinatorLayout是一個(gè)加強(qiáng)版的FrameLayout,本質(zhì)是一個(gè)ViewGroup
主要有兩個(gè)用途:

1.應(yīng)用的頂層布局管理器,作為界面其他控件的父容器
2.用作相互之間有特定交互行為的控件的父容器
通過(guò)為CoordinatorLayout的子View指定不同的Behavior(默認(rèn)的Behavior或自定義的Behavior),就可以實(shí)現(xiàn)它們之間許多復(fù)雜的交互行為,例如側(cè)滑,移動(dòng),滑動(dòng)等。

CoordinatorLayout存在的意義:

通過(guò)自定義Children的Behaviors(行為)來(lái)實(shí)現(xiàn)控件之間的交互動(dòng)畫效果。而像FloatingActionButton和AppBarLayout都有自己的DefaultBehavior(默認(rèn)行為),所以,這兩個(gè)控件更適合與CoordinatorLayout聯(lián)合使用。當(dāng)然,我們?cè)谑褂肅oordinatorLayout時(shí),也可以自己動(dòng)手編寫B(tài)ehavior來(lái)實(shí)現(xiàn)一些復(fù)雜的交互效果

二.如何使用CoordinatorLayout

添加依賴,需要添加design的依賴:

implementation 'com.android.support:design:27.1.1'

三.什么是AppBarLayout

AppBarLayout是一個(gè)垂直的 LinearLayout, 它實(shí)現(xiàn)了很多在material designs設(shè)計(jì)中提出的概念性交互功能,也就是【滾動(dòng)手勢(shì)】。

四.如何使用AppBarLayout

添加design依賴
我們可以通過(guò)給它的子View進(jìn)行setScrollFlags(int)或者直接在xml中增加屬性app:layout_scrollFlags來(lái)設(shè)置它子View的滾動(dòng)行為。
需要注意的是,AppBarLayout需要配合CoordinatorLayout進(jìn)行使用,如果只是放到普通的ViewGroup中使用的話將無(wú)法實(shí)現(xiàn)它的效果。

<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"
    tools:context="com.baidu.materiald.MainActivity">
?
    <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"
            app:layout_scrollFlags="scroll"
            android:layout_height="wrap_content"/>
?
    </android.support.design.widget.AppBarLayout>
?
    <android.support.v7.widget.RecyclerView
        //如果不加,子條目會(huì)被toolBar擋住一部分
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:id="@+id/rlv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
?
</android.support.design.widget.CoordinatorLayout>

app:layout_scrollFlags介紹:

1. scroll:

View 伴隨著滾動(dòng)事件而滾出或滾進(jìn)屏幕。注意兩點(diǎn):第一點(diǎn),如果使用了其他值,必定要使用這個(gè)值才能起作用;第二點(diǎn):如果在這個(gè)View前面的任何其他View沒(méi)有設(shè)置這個(gè)值,那么這個(gè) View的設(shè)置將失去作用。

2 enterAlways

快速返回模式。其實(shí)就是向下滾動(dòng)時(shí)Scrolling View和View(ToolBar)之間的滾動(dòng)優(yōu)先級(jí)問(wèn)題。對(duì)比scroll和scroll | enterAlways設(shè)置,發(fā)生向下滾動(dòng)事件時(shí),前者優(yōu)先滾動(dòng)Scrolling View,后者優(yōu)先滾動(dòng)View,當(dāng)優(yōu)先滾動(dòng)的一方已經(jīng)全部滾進(jìn)屏幕之后,另一方才開始滾動(dòng)。

app:layout_scrollFlags="scroll|enterAlways"

3 enterAlwaysCollapsed

enterAlways的附加值。這里涉及到View(ToolBar)的高度和最小高度,向下滾動(dòng)時(shí),View先向下滾動(dòng)最小高度值,然后Scrolling View開始滾動(dòng),到達(dá)邊界時(shí),View再向下滾動(dòng),直至顯示完全。

app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"

4 exitUntilCollapsed

這里也涉及到最小高度。發(fā)生向上滾動(dòng)事件時(shí),View向上滾動(dòng)退出直至最小高度,然后Scrolling View開始滾動(dòng)。也就是,Child View不會(huì)完全退出屏幕。

app:layout_scrollFlags="scroll|exitUntilCollapsed"

5 snap

簡(jiǎn)單理解,就是Child View滾動(dòng)比例的一個(gè)吸附效果。也就是說(shuō),Child View不會(huì)存在局部顯示的情況,滾動(dòng)Child View的部分高度,當(dāng)我們松開手指時(shí),Child View要么向上全部滾出屏幕,要么向下全部滾進(jìn)屏幕,有點(diǎn)類似ViewPager的左右滑動(dòng)。

Behavior

Behavior這個(gè)名詞看著陌生,但事實(shí)上我們經(jīng)常簡(jiǎn)單,如:

app:layout_behavior="@string/appbar_scrolling_view_behavior"

這個(gè)一般是出現(xiàn)在使用Android Stuido創(chuàng)建Activty的時(shí)候自動(dòng)創(chuàng)建的,他的作用是讓使用這個(gè)屬性的View在appbar下面滾動(dòng)。而Behavior主要的使用方式其實(shí)是通過(guò)反射來(lái)實(shí)現(xiàn)的,我們?cè)趌ayout_behavior中并沒(méi)有直接進(jìn)行引用,而是寫了包名+類名,所以Behavior是不能夠被混淆的。

使用addOnOffsetChangedListener方法為AppBarLayout添加滑動(dòng)偏移監(jiān)聽(tīng)事件,
verticalOffset 參數(shù)值表示偏移值,可用appBarLayout.getTotalScrollRange()方法獲取最大偏移值。

appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
          // TODO
    }
});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容