說說Android CoordinatorLayout

5.0之后的Android系統(tǒng),google推出了自己的移動(dòng)端設(shè)計(jì)規(guī)范怎囚,Material Design怎顾,同時(shí)sdk包中也加入了support.design包,加入了很多符合md風(fēng)格的組件怕品。這里主要講解一下CoordinatorLayout這個(gè)布局和它的使用。

什么是CoordinatorLayout

? 正如它的名字巾遭,這個(gè)布局是用來協(xié)調(diào)2個(gè)控件之間的聯(lián)動(dòng)肉康。我們使用一個(gè)圖片來說明這個(gè)布局的最終效果。

? 可以發(fā)現(xiàn)地下的視圖滑動(dòng)上去之后上面圖片所在的區(qū)域會(huì)被折疊灼舍,然后會(huì)有一個(gè)Toolbar懸停在頂部吼和。

? 下面我來實(shí)現(xiàn)以下這個(gè)效果

? 引入design包里面的組件:

compile 'com.android.support:design:25.3.1'

? 新建一個(gè)Activity和布局文件

? 布局文件如下:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="200dp">
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsingToolbarLayout_1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="@color/colorPrimary"
            app:layout_scrollFlags="exitUntilCollapsed|scroll|enterAlways"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            >

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/head_img"
                app:layout_collapseMode="parallax"
                android:scaleType="centerCrop"
                />

            <android.support.v7.widget.Toolbar
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

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

?

這個(gè)布局的分析如下:

最外層使用CoordinatorLayout,頂部的折疊部分使用AppBarLayout骑素,在AppBarLayout中我們加入了一個(gè)圖片和Toolbar炫乓,圖片和Toolbar需要包含在一個(gè)CollapsingToolbarLayout里面。

下方是一個(gè)用來滑動(dòng)的RecyclerView献丑。

分析一下一些默認(rèn)屬性的作用:

CollapsingToolbarLayout

app:contentScrim 折疊后Toolbar的顏色

app:layout_scrollFlags 滑動(dòng)折疊的五種效果

  • scroll Child View 伴隨著滾動(dòng)事件而滾出或滾進(jìn)屏幕末捣。注意兩點(diǎn):第一點(diǎn),如果使用了其他值创橄,必定要使用這個(gè)值才能起作用箩做;第二點(diǎn):如果在這個(gè)child View前面的任何其他Child View沒有設(shè)置這個(gè)值,那么這個(gè)Child View的設(shè)置將失去作用妥畏。
  • enterAlways 滾動(dòng)優(yōu)先級(jí)邦邦。比較scroll和scroll|enterAlways, 設(shè)置該屬性后安吁,向下滾動(dòng)的時(shí)候,前者優(yōu)先滾動(dòng)可滾動(dòng)的組件燃辖,后者優(yōu)先滾動(dòng)child view鬼店。
  • enterAlwaysCollapsed enterAlways的附加值。這里涉及到Child View的高度和最小高度黔龟,向下滾動(dòng)時(shí)薪韩,Child View先向下滾動(dòng)最小高度值,然后Scrolling View開始滾動(dòng)捌锭,到達(dá)邊界時(shí),Child View再向下滾動(dòng)罗捎,直至顯示完全观谦。
  • exitUntilCollapsed child view不完全退出屏幕,child view向上滾動(dòng)停住以后再往上滾動(dòng)滾動(dòng)組件桨菜。例如折疊后Toolbar不退出屏幕豁状,懸停在上方,然后RecyclerView的視圖向上滑動(dòng)倒得。
  • snap child view要么顯示要么全部退出屏幕泻红。
child view中的

app:layout_collapseMode 折疊的模式,有三種霞掺。其中none表示沒有效果谊路。其余2個(gè)分別是

  • pin 固定模式,折疊后固定在頂端菩彬。
  • parallax 視差模式缠劝,在折疊的時(shí)候會(huì)有個(gè)視差折疊的效果。

####### 可滾動(dòng)的控件

app:layout_behavior 行為骗灶,指定在scroll view上面的惨恭。這里我們?cè)O(shè)置為

app:layout_behavior="@string/appbar_scrolling_view_behavior"

這個(gè)指的是AppBarLayout中的內(nèi)部類ScrollingViewBehavior,這個(gè)用來指定RecyclerView和AppBarLayout之間的聯(lián)動(dòng)耙旦。查看源碼

@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
    // We depend on any AppBarLayouts
    return dependency instanceof AppBarLayout;
}

@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child,
View dependency) {
    offsetChildAsNeeded(parent, child, dependency);
    return false;
}

這段代碼的含義分別是指定滑動(dòng)行為根據(jù)AppBarLayout決定脱羡。在onDependentViewChanged方法中我們指定了移動(dòng)的方式。具體代碼在這不贅述免都。

這個(gè)時(shí)候我們的基本效果就實(shí)現(xiàn)了锉罐。可見這個(gè)MD控件的強(qiáng)大琴昆。當(dāng)然它的具體實(shí)現(xiàn)也是很復(fù)雜的氓鄙。

常見問題

同時(shí)我們可以發(fā)現(xiàn)Toolbar的行為是根據(jù)CollapsingToolbarLayout來控制的。

設(shè)置Toolbar的title业舍,會(huì)發(fā)現(xiàn)效果沒有達(dá)到預(yù)期抖拦。title不會(huì)隨著滑動(dòng)縮放升酣。

那么問題來了,我們?nèi)绾卧O(shè)置Toolbar的標(biāo)題呢态罪?

Toolbar的標(biāo)題我們可以如下設(shè)置:

mCollapsingToolbarLayout.setTitle("標(biāo)題");
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

現(xiàn)在問題又來了噩茄,正常我們不設(shè)置的時(shí)候,會(huì)發(fā)現(xiàn)有一個(gè)md規(guī)范控件自帶的效果复颈,標(biāo)題會(huì)在滾動(dòng)過程中上下移動(dòng)并且縮放大小的效果绩聘。有時(shí)候我們并不想把標(biāo)題顯示在下發(fā),這個(gè)時(shí)候應(yīng)該怎么辦呢耗啦?

可以在style文件中設(shè)置

<style name="collapsing_toolbar_text_size">
    <item name="android:textSize">0sp</item>
</style>

在Activity中設(shè)置

mCollapsingToolbarLayout
  .setExpandedTitleTextAppearance(R.style.collapsing_toolbar_text_size);

這句代碼的含義是設(shè)置滑動(dòng)后的標(biāo)題字體大小凿菩,我們?cè)O(shè)置為0sp,就不會(huì)有任何顯示了帜讲。

附上最后Activity里面的代碼衅谷,也可以參考我在github上的demo代碼

public class CoordinatorTestActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private List<String> data = new ArrayList<>();
    private CollapsingToolbarLayout collapsingToolbarLayout;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_coordinator);
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        initData();
        MyAdapter adapter = new MyAdapter(this,data);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
        collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsingToolbarLayout_1);
        collapsingToolbarLayout.setTitle("標(biāo)題");
        collapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.collapsing_toolbar_text_size);
    }

    private void initData() {
        for (int i = 0;i < 20;i++) {
            data.add("str"+i);
        }
    }

    class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
        private Context mContext;
        private List<String> mData;

        public MyAdapter(Context context, List<String> data) {
            mContext = context;
            mData = data;
        }

        @Override
        public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new MyHolder(LayoutInflater.from(mContext).inflate(android.R.layout.simple_list_item_1, parent, false));
        }

        @Override
        public void onBindViewHolder(MyHolder holder, int position) {
            String text = mData.get(position);
            holder.tv.setText(text);
        }

        @Override
        public int getItemCount() {
            return mData.size();
        }

        class MyHolder extends RecyclerView.ViewHolder{
            TextView tv;
            public MyHolder(View itemView) {
                super(itemView);
                tv = (TextView) itemView.findViewById(android.R.id.text1);
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市似将,隨后出現(xiàn)的幾起案子获黔,更是在濱河造成了極大的恐慌,老刑警劉巖在验,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玷氏,死亡現(xiàn)場離奇詭異,居然都是意外死亡腋舌,警方通過查閱死者的電腦和手機(jī)盏触,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來块饺,“玉大人耻陕,你說我怎么就攤上這事∨俾伲” “怎么了诗宣?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長想诅。 經(jīng)常有香客問我召庞,道長,這世上最難降的妖魔是什么来破? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任篮灼,我火速辦了婚禮,結(jié)果婚禮上徘禁,老公的妹妹穿的比我還像新娘诅诱。我一直安慰自己,他們只是感情好送朱,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布娘荡。 她就那樣靜靜地躺著干旁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炮沐。 梳的紋絲不亂的頭發(fā)上争群,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音大年,去河邊找鬼换薄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翔试,可吹牛的內(nèi)容都是我干的轻要。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼垦缅,長吁一口氣:“原來是場噩夢啊……” “哼伦腐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起失都,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幸冻,沒想到半個(gè)月后粹庞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洽损,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年庞溜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碑定。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡流码,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出延刘,到底是詐尸還是另有隱情漫试,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布碘赖,位于F島的核電站驾荣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏普泡。R本人自食惡果不足惜播掷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撼班。 院中可真熱鬧歧匈,春花似錦、人聲如沸砰嘁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妻率,卻和暖如春乱顾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宫静。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國打工走净, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孤里。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓伏伯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捌袜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子说搅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容