1. 程式人生 > >android介面設計語言Material Design---可摺疊式標題欄

android介面設計語言Material Design---可摺疊式標題欄

可摺疊式標題欄

         CollapsingToolbarLayout是一個作用於Toolbar基礎之上的佈局,可以使標題欄產生華麗的效果。

         CollapsingToolbarLayout不能獨立存在,只能作為AppBarLayout的直接子佈局來使用。而AppBarLayout又必須是CoordinatorLayout的子佈局。

                                                                               

         佈局分為兩部分,一個水果標題欄,一個水果內容詳情。

         我先使用CoordinatorLayout來完成最外層佈局

<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.example.rotateimageview.FruitActivity">
</android.support.design.widget.CoordinatorLayout>

其中xmlns:app的命題空間,在Material Design的開發中我們會經常用到。

         接著我們在CoordinatorLayout中巢狀一個AppBarLayout佈局

<android.support.design.widget.AppBarLayout
    android:id="@+id/appBar"
    android:layout_width=
"match_parent"     android:layout_height="250dp">
</android.support.design.widget.AppBarLayout>

高度設為250dp,個人覺得250dp的視覺效果比較好。

         接著我們在AppBarLayout中巢狀一個CollapsingToolbarLayout佈局

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

android:theme屬性設定主題

app:contentScrim屬性設定CollapsingToolbarLayout在趨於摺疊狀態以及摺疊之後的背景色

app:layout_scrollFlags屬 scroll表示CollapsingToolbarLayout會隨著內容詳情的滾動一起滾動,exitUntilCollapsed表示當CollapsingToolbarLayout隨著滾動完成摺疊之後就保留在介面上,不在移出螢幕。

這樣我們把框架這些搭好了,現在定義標題欄的具體內容。

         在CollapsingToolbarLayout中巢狀一個ImageView,一個Toolbar

<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:scaleType是控制圖片如何resized/moved來匹對ImageView的size

android:scaleTyoe = “centerCrop” 按比例擴大圖片的size居中顯示,使得圖片長(寬)等於或大於View的長(寬)。

app:layout_collapseMode屬性表示摺疊過程中的摺疊方式是怎麼樣的。

app:layout_collapseMode = “parallax” 表示摺疊過程中產生一定的錯位偏移

app:layout_collapseMode= “pin”表示摺疊過程中位置始終保持不變

標題欄搞定,我們在CoordinatorLayout佈局中新增關於內容的詳細部分。

         我們在CoordinatorLayout中巢狀一個NestedScrollView

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

App:layout_behavior屬性指定一個佈局行為

@string/appbar_scrolling_view_behavior可以上下滾動的行為

         無論是ScrollView還是NestedScrollView都是隻允許存在一個直接子佈局,所以我們加入LinearLayout,在其中新增自己想加入東西。

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</android.support.design.widget.AppBarLayout>

 我們在LinearLayout中新增一個ImageView(這裡我們使用CardView,因為前面有一個CardView佈局,我們把資料直接傳過來就是)和一個TextView.

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

我們再在CoordinayorLayout中新增一個懸浮按鈕FloatingActionButton。

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

app:layout_anchor屬性指定一個錨點(我們將錨點設定為AppBarLayout,使懸浮按鈕出現在水果標題欄的區域)

app:layout_anchorGravity屬性將懸浮按鈕定位在標題欄區域的右下角

佈局宣佈搞定,這下來活動中編寫邏輯程式碼

public class FruitActivity extends AppCompatActivity {

    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 intent = getIntent();
        String fruitName = intent.getStringExtra(FRUIT_NAME);//接受名字
        int fruitImageId = intent.getIntExtra(FRUIT_IMAGE_ID,0);//接受圖片地址
        android.support.v7.widget.Toolbar toolbar =
                (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
        android.support.design.widget.CollapsingToolbarLayout collapsingToolbarLayout =
                (android.support.design.widget.CollapsingToolbarLayout)
                        findViewById(R.id.collapsing_toolbar);
        ImageView fruitImageView = (ImageView)findViewById(R.id.fruit_image_view);
        TextView fruitContentText = (TextView) findViewById(R.id.fruit_content_text);
        setSupportActionBar(toolbar);//把Toolbar作為ActionBar顯示
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null){
            actionBar.setDisplayHomeAsUpEnabled(true);//啟動HomeAsUP按鈕,預設新增一個返回箭頭

        }
        collapsingToolbarLayout.setTitle(fruitName);//將傳入的水果名作為當前介面的標題
        Glide.with(FruitActivity.this).load(fruitImageId).into(fruitImageView);//載入傳入的水果圖片
        String fruitContent = generateFruitContent(fruitName);//呼叫方法
        fruitContentText.setText(fruitContent);
    }
    private String generateFruitContent(String fruitName){
        StringBuffer fruitContent = new StringBuffer();
        for (int i = 0;i<500;i++){
            fruitContent.append(fruitName);//把水果名拼接,迴圈500次
        }
        return fruitContent.toString();
    }

    //HomeAsUp按鈕的點選事件
    public boolean onOptonsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

然後在主活動相應的介面卡中獲取水果名和水果圖片資源的id,並把它們通過Itent實現活動之間的資料傳遞。

所有工作完成

下面成果展示:               

 

補充:

充分利用系統狀態列空間

         在CoodinatorLayout、AppBarLayout、CollapsingToolbarLayout、ImageView中新增一句

        android:fitsSystemWindows="true"

         這個屬性表示控制元件可以出現在狀態列裡

然後編寫一個res/Values resource file/styles.xml

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

在AndroidManifest.xml中註冊

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