Material Design 實(shí)戰(zhàn) 之 第六彈 —— 可折疊式標(biāo)題欄(CollapsingToolbarLayout) & 系統(tǒng)差異型的功能實(shí)現(xiàn)(充分利用系統(tǒng)狀態(tài)欄空間)


本模塊共有六篇文章,參考郭神的《第一行代碼》励负,對(duì)Material Design的學(xué)習(xí)做一個(gè)詳細(xì)的筆記叼丑,大家可以一起交流一下:






引子:



文章提要與總結(jié)


1. CollapsingToolbarLayout

    1.1 CollapsingToolbarLayout是一個(gè)作用于Toolbar基礎(chǔ)之上的布局饭庞,由DesignSupport庫提供橄登。

    1.2 CollapsingToolbarLayout不能獨(dú)立存在,
        它在設(shè)計(jì)的時(shí)候就被限定只能作為AppBarLayout的直接子布局來使用败富。
        而AppBarLayout又必須是CoordinatorLayout的子布局悔醋;
    1.3 水果詳情界面布局框架:
        CoordinatorLayout下分三部分:水果標(biāo)題欄、水果詳情欄兽叮、懸浮按鈕篙顺;
        具體屬性意義詳見文章;

        <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout  ......
    android:fitsSystemWindows="true">

    <!--水果標(biāo)題欄-->
    <android.support.design.widget.AppBarLayout  ......
        android:layout_height="250dp"
        android:fitsSystemWindows="true">
        <android.support.design.widget.CollapsingToolbarLayout  ......
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">
            <ImageView  ......
            android:scaleType="centerCrop"
                android:fitsSystemWindows="true"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar   ......
                app:layout_collapseMode="pin"/>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <!--水果詳情欄-->
    <android.support.v4.widget.NestedScrollView   ......
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            ......>

            <android.support.v7.widget.CardView   ......
                android:layout_marginBottom="15dp"   ......
                app:cardCornerRadius="4dp">

            <TextView   ......
                android:layout_margin="10dp"/>
            </android.support.v7.widget.CardView>
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton   ......
        android:src="@drawable/ic_comment"
        app:layout_anchor="@id/appBar"
        app:layout_anchorGravity="bottom|end"/>

</android.support.design.widget.CoordinatorLayout>
    1.4 水果詳情界面java邏輯:
    public class FruitActivity extends AppCompatActivity {

        全局變量:設(shè)置約定 intent 傳輸鍵值常量充择;

        @Override
        protected void onCreate(Bundle savedInstanceState){
           此類是水果詳情頁,通過intent獲得來自水果卡片列表頁傳來的數(shù)據(jù)(水果名字和圖片id)匪蟀;
            實(shí)例化諸對(duì)象椎麦;
            設(shè)置toolbar
            設(shè)置導(dǎo)航按鈕
           設(shè)置折疊欄標(biāo)題
            加載圖片,設(shè)置文字
           }

            利用StringBuilder重復(fù)fruitname生成長字符串
        private String generateFruitContent(String fruitName){ }
    
           響應(yīng)導(dǎo)航按鈕
            @Override
        public boolean onOptionsItemSelected(MenuItem item) {}
      }


    1.5 處理RecyclerView的點(diǎn)擊事件材彪,將點(diǎn)擊到的卡片子項(xiàng)提取出name和imageId观挎,
        用intent傳給水果詳情界面展示;

2. 充分利用系統(tǒng)狀態(tài)欄空間(系統(tǒng)差異型)

    2.1 將控件(這里是ImageView)布局結(jié)構(gòu)中的所有父布局的
        android:fitsSystemWindows屬性指定成true段化,就表示該控件會(huì)出現(xiàn)在系統(tǒng)狀態(tài)欄里嘁捷;

    2.2 在程序的主題中將狀態(tài)欄顏色指定成透明色;
        在主題中將android:statusBarColor屬性的值指定成@android:color/transparent显熏;
    2.3 創(chuàng)建一個(gè)values-v21目錄雄嚣;values-v21目錄下創(chuàng)建一個(gè)styles.xml文件;
        編寫:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="FruitActivityTheme" parent="AppTheme">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

    2.4 修改values/styles.xml文件:
<resources>......
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">  ......
    </style>
    <style name="FruitActivityTheme" parent="AppTheme">
    </style>
</resources>
    
    2.5 修改AndroidManifest.xmI:
        <activity 
            android:name=".FruitActivity"
            android:theme="@style/FruitActivityTheme">
        </activity>

效果圖




正文


可折疊式標(biāo)題欄(CollapsingToolbarLayout)  /k?'l?ps??/

顧名思義缓升,CollapsingToolbarLayout是一個(gè)作用于Toolbar基礎(chǔ)之上的布局鼓鲁,由DesignSupport庫提供。

CollapsingToolbarLayout可以讓Toolbar的效果變得更加豐富港谊,不僅僅是展示一個(gè)標(biāo)題欄骇吭,而是能夠?qū)崿F(xiàn)非常華麗的效果。

不過CollapsingToolbarLayout不能獨(dú)立存在歧寺,它在設(shè)計(jì)的時(shí)候就被限定只能作為AppBarLayout的直接子布局來使用燥狰。而AppBarLayout又必須是CoordinatorLayout的子布局。

本文來做一個(gè)額外的活動(dòng)作為水果的詳情展示界面斜筐,當(dāng)點(diǎn)擊水果列表卡片的時(shí)候就進(jìn)入這個(gè)界面龙致。
右擊com.example.materialtest包—>New—>Activity—>EmptyActivity,創(chuàng)建一個(gè)FruitActivity奴艾,并將布局名指定成activity_fruit.xml净当。
接著我們來編寫這個(gè)布局。
Activity_fruit.xml中的內(nèi)容主要分為兩部分蕴潦,一個(gè)是水果標(biāo)題欄像啼,一個(gè)是水果內(nèi)容詳情。

首先實(shí)現(xiàn)標(biāo)題欄部分潭苞,這里使用CoordinatorLayout來作為最外層布局(我們?cè)谥v監(jiān)測(cè)snackbar彈出忽冻,解決其遮擋懸浮按鈕問題的時(shí)候用到過這個(gè)布局),如下:

<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.CoordinatorLayout>

接著在里面嵌套一個(gè)AppBarLayout:

<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:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="250dp">
    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

這里主要是將高度指定為250dp此疹,郭神親測(cè)覺得這樣視覺效果比較好僧诚。

接著在AppBarLayout中再嵌套一個(gè)CollapsingToolbarLayout:

<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:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="250dp">
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

這里使用了新的布局CollapsingToolbarLayout。

其中蝗碎,

  • android:theme指定了ThemeOverlay.AppCompat.Dark.ActionBar主題湖笨,之前(第四彈)在activitymain.xml中給Toolbar指定的也是這個(gè)主題,只不過這里要實(shí)現(xiàn)更加高級(jí)的Toolbar效果蹦骑,因此需要將這個(gè)主題的指定提到上一層來慈省。

  • app:contentScrim指定CollapsmgToolbarLayout在趨于折疊狀態(tài)以及折疊之后的背景色,
    其實(shí)CollapsingToolbarLayout在折疊之后就是一個(gè)普通的Toolbar眠菇,背景色是colorPrimary边败;

  • app:layout_scrollFlags之前(第四彈)是給Toolbar指定的,現(xiàn)在也移到外面來了捎废。

其中笑窜,

  • scroll表示CollapsingToolbarLayout會(huì)隨著水果內(nèi)容詳情的滾動(dòng)一起滾動(dòng),
  • exitUntilCollapsed表示當(dāng)CollapsingToolbarLayout隨著滾動(dòng)完成折疊之后就保留在界面上登疗,不再移出屏幕排截。

接下來在CollapsingToolbarLayout中定義標(biāo)題欄的具體內(nèi)容:

......
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">
            <ImageView
                android:id="@+id/fruit_image_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent" 
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax"/>
            
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"/>
        </android.support.design.widget.CollapsingToolbarLayout>
......

這里在CollapsingToolbarLayout中定義了一個(gè)ImageView和一個(gè)Toolbar,也即這個(gè)高級(jí)版的標(biāo)題欄是由普通的標(biāo)題欄加上圖片組合而成的。
以及匾寝,

  • app:layout_collapseMode用于指定當(dāng)前控件在CollapsingToolbarLayout折疊過程中的折疊模式搬葬,
    其中Toolbar指定成pin,表示在折疊的過程中位置始終保持不變艳悔,
  • ImageView指定成parallax急凰,表示會(huì)在折疊的過程中產(chǎn)生一定的錯(cuò)位偏移,這種模式的視覺效果會(huì)非常好猜年。

下面編寫水果內(nèi)容詳情部分抡锈,繼續(xù)改activity_fruit.xml:

......
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>
    
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        
    </android.support.v4.widget.NestedScrollView>
    
</android.support.design.widget.CoordinatorLayout>

我們知道ScrollView允許使用滾動(dòng)的方式來查看屏幕以外的數(shù)據(jù),
而NestedScrollView在此基礎(chǔ)之上增加了嵌套響應(yīng)滾動(dòng)事件的功能乔外。

由于CoordinatorLayout本身已經(jīng)可以響應(yīng)滾動(dòng)事件了床三,
因此我們?cè)谒膬?nèi)部就需要使用NestedScrollView或RecyclerView這樣可以響應(yīng)滾動(dòng)事件的布局。

另外杨幼,通過
app:layout_behavior屬性指定一個(gè)布局行為撇簿,這和之前 第四彈
在RecyclerView中的用法是一模一樣的。

不管是ScrollView還是NestedScroIIView差购,它們的內(nèi)部都只允許存在一個(gè)直接子布局四瘫。
如果我們想要在里面放入很多東西的話,通常都會(huì)先嵌套一個(gè)LinearLayout,然后再在LinearLayout中放入具體的內(nèi)容欲逃,如下:

......
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

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

接下來在LinearLayout中放入具體的內(nèi)容找蜜,
使用一個(gè)TextView來顯示水果的內(nèi)容詳情,
并將TextView放在一個(gè)卡片式布局當(dāng)中:

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

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            
            <android.support.v7.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="15dp"
                android:layout_marginLeft="15dp"
                android:layout_marginRight="15dp"
                android:layout_marginTop="35dp"
                app:cardCornerRadius="4dp">
                
            <TextView
                android:id="@+id/fruit_content_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"/>
            </android.support.v7.widget.CardView>
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

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

這里主要要注意的是稳析,為了讓界面更加美觀洗做,在CardView和TextView上都加了一些邊距。
其中彰居,
CardView的marginTop加了35dp的邊距诚纸,這是為下面要編寫的東西留出空間。
至此水果標(biāo)題欄和水果內(nèi)容詳情的界面便編寫完了陈惰。

接著還可以在界面上再添加一個(gè)懸浮按鈕咬清,
當(dāng)然并不是必需的,只是如果加的話奴潘,我們將免費(fèi)獲得一些額外的動(dòng)畫效果。

這里就實(shí)戰(zhàn)一下影钉,在activity_fruit.xml中加一個(gè)關(guān)于水果的表示評(píng)論作用的懸浮按鈕画髓。

首先需要提前準(zhǔn)備好一個(gè)圖標(biāo),
這里放置了一張ic_comment.png到drawable-xxhdpi目錄下平委。
然后修改activity_fruit.xml:

......
    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:src="@drawable/ic_comment"
        app:layout_anchor="@id/appBar"
        app:layout_anchorGravity="bottom|end"/>

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

這里加了一個(gè)FloatingActionButton,它和AppBarLayout(水果標(biāo)題欄)以及NestedScrollView(水果詳情欄)布局平級(jí)奈虾。

FloatingActionButton中,
app:layou_anchor屬性(anchor n.錨狀物)指定了一個(gè)錨點(diǎn),這里將錨點(diǎn)設(shè)置為AppBarLayout肉微,這樣懸浮按鈕就會(huì)出現(xiàn)在水果標(biāo)題欄的區(qū)域內(nèi)匾鸥;
app:layout_anchorGravity屬性將懸浮按鈕定位在標(biāo)題欄區(qū)域的右下角。

至此activity_fruit.xml布局(水果詳情界面)便寫完了碉纳。

界面完成了之后勿负,接著開始編寫功能邏輯,修改FruitActivity(水果詳情界面的邏輯):

public class FruitActivity extends AppCompatActivity {

    //設(shè)置約定 intent 傳輸鍵值常量
    public static final String FRUIT_NAME = "fruit_name";
    public static final String FRUIT_IMAGE_ID = "fruit_image_id";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fruit);

        //此類是水果詳情頁劳曹,通過intent獲得來自水果卡片列表頁傳來的數(shù)據(jù)(水果名字和圖片id)
        Intent intent = getIntent();
        String fruitname = intent.getStringExtra(FRUIT_NAME);
        int fruitImageId = intent.getIntExtra(FRUIT_IMAGE_ID, 0);

        //實(shí)例化諸對(duì)象
        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
        ImageView fruitImageView = (ImageView) findViewById(R.id.fruit_image_view);
        TextView fruitContentText = (TextView) findViewById(R.id.fruit_content_text);

        //設(shè)置toolbar
        setSupportActionBar(toolbar);
        //設(shè)置導(dǎo)航按鈕
        ActionBar actionBar = getSupportActionBar();
        if(actionBar != null){
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
        //設(shè)置折疊欄標(biāo)題
        collapsingToolbar.setTitle(fruitname);

        //加載圖片奴愉,設(shè)置文字
        Glide.with(this).load(fruitImageId).into(fruitImageView);
        String fruitContent = generateFruitContent(fruitname);
        fruitContentText.setText(fruitContent);
    }

    //利用StringBuilder重復(fù)fruitname生成長字符串
    private String generateFruitContent(String fruitName){
        StringBuilder fruitContent = new StringBuilder();
        for(int i = 0; i < 500; i++){
            fruitContent.append(fruitName);
        }
        return fruitContent.toString();
    }

    //響應(yīng)導(dǎo)航按鈕
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

接下來處理RecyclerView的點(diǎn)擊事件,將點(diǎn)擊到的卡片子項(xiàng)提取出name和imageId铁孵,
用intent傳給水果詳情界面展示锭硼,下面修改FruitAdapter:

......
//加載子布局,將子項(xiàng)作為參數(shù)傳給ViewHolder蜕劝,在ViewHolder里面
    //為cardView添加點(diǎn)擊事件
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(mContext == null){
            mContext = parent.getContext();
        }
        View view = LayoutInflater.from(mContext).inflate(R.layout.fruit_item,
                parent, false);
        final ViewHolder holder = new ViewHolder(view);//將子項(xiàng)作為參數(shù)傳給ViewHolder檀头,在ViewHolder里面面實(shí)例化子項(xiàng)中的各個(gè)對(duì)象
        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = holder.getAdapterPosition();//獲得列表對(duì)應(yīng)子項(xiàng)的位置
                //mFruitList由new適配器的時(shí)候傳進(jìn)來的構(gòu)造函數(shù)的參數(shù)提供,
                // get(position)將子項(xiàng)對(duì)應(yīng)位置的水果對(duì)象從設(shè)置到適配器中的水果列表數(shù)據(jù)中取出來
                Fruit fruit = mFruitList.get(position);
                Intent intent = new Intent(mContext, FruitActivity.class);
                intent.putExtra(FruitActivity.FRUIT_NAME, fruit.getName());
                intent.putExtra(FruitActivity.FRUIT_IMAGE_ID,fruit.getImageId());
                mContext.startActivity(intent);
            }
        });
        return holder;
    }
......

修改前(原全文見第四彈):

......
    //加載子布局岖沛,將子項(xiàng)作為參數(shù)傳給ViewHolder暑始,在ViewHolder里面
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(mContext == null){
            mContext = parent.getContext();
        }
        View view = LayoutInflater.from(mContext).inflate(R.layout.fruit_item,
                parent, false);
        return new ViewHolder(view);//將子項(xiàng)作為參數(shù)傳給ViewHolder,在ViewHolder里面實(shí)例化子項(xiàng)中的各個(gè)對(duì)象
    }
......

重新運(yùn)行一下程序烫止,效果如下:


向上拖動(dòng)水果圖片蒋荚,背景圖上的標(biāo)題會(huì)慢慢縮小,而且會(huì)產(chǎn)生錯(cuò)位偏移的效果馆蠕,toolbar的位置和圖片還會(huì)產(chǎn)生透明度的變化等等期升,效果十分炫酷。

這是由于用戶想要查看水果的內(nèi)容詳情互躬,此時(shí)界面的重點(diǎn)在具體的內(nèi)容上面播赁,因此標(biāo)題欄就會(huì)自動(dòng)進(jìn)行折疊,從而節(jié)省屏幕空間吼渡。

繼續(xù)向上拖動(dòng)容为,直到標(biāo)題欄變成完全折疊狀態(tài),效果如圖:


而這個(gè)時(shí)候向下拖動(dòng)水果內(nèi)容詳情寺酪,就會(huì)執(zhí)行一個(gè)完全相反的動(dòng)畫過程坎背。最終恢復(fù)剛剛點(diǎn)進(jìn)來的樣子。






那個(gè)這里的話其實(shí)有個(gè)小尷尬寄雀,再次強(qiáng)調(diào)注意命名規(guī)范的重要性了得滤。。盒犹。
首先這個(gè)是水果詳情界面標(biāo)題欄的ImageView懂更,id是fruit_image_view


另下面這個(gè)是卡片水果列表界面的ImageView眨业,id是fruit_image

我在水果詳情界面的邏輯中,findViewbyid寫錯(cuò)成了卡片水果列表界面的ImageView的id:


以至于點(diǎn)擊水果卡片的時(shí)候報(bào)錯(cuò):

java.lang.IllegalArgumentException: You must pass in a non null View

畢竟點(diǎn)擊水果卡片之后是要跳轉(zhuǎn)到水果詳情界面了沮协,邏輯還要去設(shè)置進(jìn)入onStop()狀態(tài)的卡片水果列表界面的控件龄捡,顯然這肯定是不行的。

將剛剛寫錯(cuò)的地方——實(shí)例化使用的id改正一下即可:

ImageView fruitImageView = (ImageView) findViewById(R.id.fruit_image_view);





充分利用系統(tǒng)狀態(tài)欄空間


這里如果將背景圖和狀態(tài)欄融合到一起慷暂,絕對(duì)能讓視覺體驗(yàn)提升好幾個(gè)檔次了聘殖。

只不過Android5.0系統(tǒng)之前是無法對(duì)狀態(tài)欄的背景或顏色進(jìn)行操作的,那個(gè)時(shí)候也沒有Matenal Design的概念呜呐。
而Android5.0及之后的系統(tǒng)就支持這個(gè)功能就斤。

所以這里需要一個(gè)系統(tǒng)差異型的效果,即
對(duì)于Android5.0及之后的系統(tǒng)使用背景圖和狀態(tài)欄融合的模式蘑辑;
在之前的系統(tǒng)中使用普通的模式洋机;

讓背景圖和系統(tǒng)狀態(tài)欄融合,需要借助Android:fitsSystemWindows這個(gè)屬性來實(shí)現(xiàn)洋魂。


CoordinatorLayout(外層監(jiān)聽框架)绷旗、
AppBarLayout(水果詳情界面標(biāo)題欄外層)、
CollapsingToolbarLayout(水果詳情界面標(biāo)題欄)這種嵌套結(jié)構(gòu)的布局中副砍,
將控件的android:fitsSystemWindows屬性指定成true衔肢,就表示該控件會(huì)出現(xiàn)在系統(tǒng)狀態(tài)欄里。

對(duì)應(yīng)到我們的程序豁翎,那就是水果標(biāo)題欄中的ImageView應(yīng)該設(shè)置這個(gè)屬性了角骤。
不過只給ImageView設(shè)置這個(gè)屬性是沒有用的
我們必須將ImageView布局結(jié)構(gòu)中的所有父布局都設(shè)置上這個(gè)屬性才可以心剥,
修改activity_fruit.xml中的代碼邦尊,如下所示:

這里除了將android:fitsSystemWindows屬性設(shè)置好,還必須在程序的主題中將狀態(tài)欄顏色指定成透明色优烧。
方法很簡單蝉揍,在主題中將android:statusBarColor屬性的值指定成@android:color/transparent即可。
但android:statusBarCoIor這個(gè)屬性是從API 21畦娄,即Android5.0系統(tǒng)開始才有的又沾,之前的系統(tǒng)無法指定這個(gè)屬性。

那么熙卡,系統(tǒng)差異型的功能實(shí)現(xiàn)至此開始杖刷;

右擊res目錄—>New—>Directory,創(chuàng)建一個(gè)values-v21目錄,然后右擊values-v21目錄—>New
—>Values resource file驳癌,創(chuàng)建一個(gè)styles.xml文件滑燃。對(duì)這個(gè)文件進(jìn)行編寫:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="FruitActivityTheme" parent="AppTheme">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>

</resources>

這里定義了一個(gè)FruitActivityTheme主題,

  • 它是專門給FruitAcuvity使用的喂柒。
  • FruitActivityTheme的parent主題是AppTheme不瓶,也就是說它繼承了AppTheme中的所有特性。
  • 然后在FruitAcuvityTheme中將狀態(tài)欄的顏色指定成透明色灾杰,
    由于values-v21目錄是只有Android5.0及以上的系統(tǒng)才會(huì)去讀取的蚊丐,
    因此這么聲明是沒有問題的。

但是Android5.0之前的系統(tǒng)卻無法識(shí)別FruitActivityTheme這個(gè)主題艳吠,因此還需修改values/styles.xml文件:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <!--修改了這兒-->
    <style name="FruitActivityTheme" parent="AppTheme">
    </style>
</resources>

這里也定義了一個(gè)FruitActivityTheme主題,并且parent主題也是AppTheme,但是它的內(nèi)部是空的搓彻。
因?yàn)锳ndroid5.0之前的系統(tǒng)無法指定狀態(tài)欄的顏色峦甩,因此這里什么都不用做就可以了。

5.0之前的版本會(huì)加載這里的FruitActivityTheme栏渺,也就是間接地使用了默認(rèn)的AppTheme主題呛梆;
5.0之后的版本或許也加載這里的FruitActivityTheme,但同時(shí)讀取values-v21的styles磕诊,隨后剛剛我們做的設(shè)置狀態(tài)欄的代碼會(huì)將這里的覆蓋掉填物,也就是使用了我們編寫的新的FruitActivityTheme。
于是達(dá)到了系統(tǒng)差異型的功能實(shí)現(xiàn)的目的霎终。

最后還需讓FruitActivity使用這個(gè)主題滞磺,修改AndroidManifest.xmI:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.materialtest">

    <application
        ......
        <activity 
            android:name=".FruitActivity"
            android:theme="@style/FruitActivityTheme">
        </activity>
    </application>

</manifest>

這里使用android:theme屬性單獨(dú)給FruitActivity指定了這個(gè)主題,到這里就大功告成了莱褒。
現(xiàn)在只要是在Android5.0及以上的系統(tǒng)運(yùn)行這個(gè)MaterialTest程序击困,水果詳情展示界面的效果便如下:


跟剛剛的效果相比,視覺體驗(yàn)是完全不同檔次的广凸。

關(guān)于的 Material Design 學(xué)習(xí)到此就告一段落了阅茶,具體的可以參考 Material Design的官方文檔:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炮障,隨后出現(xiàn)的幾起案子目派,更是在濱河造成了極大的恐慌,老刑警劉巖胁赢,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件企蹭,死亡現(xiàn)場離奇詭異,居然都是意外死亡智末,警方通過查閱死者的電腦和手機(jī)谅摄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來系馆,“玉大人送漠,你說我怎么就攤上這事∮赡ⅲ” “怎么了闽寡?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵代兵,是天一觀的道長。 經(jīng)常有香客問我爷狈,道長植影,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任涎永,我火速辦了婚禮思币,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羡微。我一直安慰自己谷饿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布妈倔。 她就那樣靜靜地躺著博投,像睡著了一般。 火紅的嫁衣襯著肌膚如雪启涯。 梳的紋絲不亂的頭發(fā)上贬堵,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音结洼,去河邊找鬼黎做。 笑死,一個(gè)胖子當(dāng)著我的面吹牛松忍,可吹牛的內(nèi)容都是我干的蒸殿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼鸣峭,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼宏所!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摊溶,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤爬骤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后莫换,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霞玄,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年拉岁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坷剧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喊暖,死狀恐怖惫企,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陵叽,我是刑警寧澤狞尔,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布丛版,位于F島的核電站,受9級(jí)特大地震影響偏序,放射性物質(zhì)發(fā)生泄漏硼婿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一禽车、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刊殉,春花似錦殉摔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遍膜,卻和暖如春碗硬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓢颅。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工恩尾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挽懦。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓翰意,卻偏偏與公主長得像,于是被迫代替她去往敵國和親信柿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冀偶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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