本模塊共有六篇文章,參考郭神的《第一行代碼》励负,對(duì)Material Design的學(xué)習(xí)做一個(gè)詳細(xì)的筆記叼丑,大家可以一起交流一下:
- Material Design 實(shí)戰(zhàn) 之第一彈——Toolbar(即本文)
- Material Design 實(shí)戰(zhàn) 之第二彈——滑動(dòng)菜單詳解&實(shí)戰(zhàn)
- Material Design 實(shí)戰(zhàn) 之第三彈—— 懸浮按鈕和可交互提示(FloatingActionButton & Snackbar & CoordinatorLayout)
- Material Design 實(shí)戰(zhàn) 之第四彈 —— 卡片布局以及靈動(dòng)的標(biāo)題欄(CardView & AppBarLayout)
- Material Design 實(shí)戰(zhàn) 之第五彈 —— 下拉刷新(SwipeRefreshLayout)
- Material Design 實(shí)戰(zhàn) 之 第六彈 —— 可折疊式標(biāo)題欄(CollapsingToolbarLayout) & 系統(tǒng)差異型的功能實(shí)現(xiàn)(充分利用系統(tǒng)狀態(tài)欄空間)
引子:
文章提要與總結(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的官方文檔: