轉自:Keegan小鋼 http://keeganlee.me/post/android/20150909
android 樣式的開發 shape篇
android 樣式的開發 selector篇
Android樣式的開發:layer-list篇
Android樣式的開發:drawable彙總篇
Android樣式的開發:View Animation篇
Android樣式的開發:Property Animation篇
Android樣式的開發:Style篇

上圖Tab的背景效果,和帶陰影的圓角矩形,是怎麼實作的呢?大部分的人會讓美工切圖,用點九圖做背景。但是,如果隻提供一張圖,會怎麼樣呢?比如,中間的Tab背景紅色底線的像素高度為4px,那麼,在mdpi裝置上顯示會符合預期,在hdpi裝置上顯示時會細了一點點,在xhdpi裝置上顯示時會再細一點,在xxhdpi上顯示時又細了,在xxxhdpi上顯示時則更細了。因為在xxxhdpi上,1dp=4px,是以,4px的圖,在xxxhdpi裝置上顯示時,就隻剩下1dp了。是以,為了适配好各種分辨率,必須提供相應的多套圖檔。如果去檢視android的res源碼資源,也會發現,像這種Tab的背景點九圖,也根據不同分辨率尺寸提供了不同尺寸的點九圖檔。
但是,在這個demo裡,都沒有用到任何實際的圖檔資源,都是用shape、selector,以及本篇要講解的layer-list完成的。
使用layer-list可以将多個drawable按照順序層疊在一起顯示,像上圖中的Tab,是由一個紅色的層加一個白色的層疊在一起顯示的結果,陰影的圓角矩形則是由一個灰色的圓角矩形疊加上一個白色的圓角矩形。先看下代碼吧,以下是Tab背景的代碼:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 第一種加載方式 -->
<!--<item android:drawable="@drawable/bg_tab_selected" android:state_checked="true" />-->
<!-- 第二種加載方式 -->
<item android:state_checked="true">
<layer-list>
<!-- 紅色背景 -->
<item>
<color android:color="#E4007F" />
</item>
<!-- 白色背景 -->
<item android:bottom="4dp" android:drawable="@android:color/white" />
</layer-list>
</item>
<item>
<layer-list>
<!-- 紅色背景 -->
<item>
<color android:color="#E4007F" />
</item>
<!-- 白色背景 -->
<item android:bottom="1dp" android:drawable="@android:color/white" />
</layer-list>
</item>
</selector>
- 以下是帶陰影的圓角矩形:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 灰色陰影 -->
<item
android:left="2dp"
android:top="4dp">
<shape>
<solid android:color="@android:color/darker_gray" />
<corners android:radius="10dp" />
</shape>
</item>
<!-- 白色前景 -->
<item
android:bottom="4dp"
android:right="2dp">
<shape>
<solid android:color="#FFFFFF" />
<corners android:radius="10dp" />
</shape>
</item>
</layer-list>
- 從上面的示例代碼可以看到,layer-list可以作為根節點,也可以作為selector中item的子節點。layer-list可以添加多個item子節點,每個item子節點對應一個drawable資源,按照item從上到下的順序疊加在一起,再通過設定每個item的偏移量就可以看到陰影等效果了。layer-list的item可以通過下面四個屬性設定偏移量:
- android:top 頂部的偏移量
- android:bottom 底部的偏移量
- android:left 左邊的偏移量
- android:right 右邊的偏移量
這四個偏移量和控件的margin設定差不多,都是外間距的效果。如何不設定偏移量,前面的圖層就完全擋住了後面的圖層,進而也看不到後面的圖層效果了。比如上面的例子,Tab背景中的白色背景設定了android:bottom之後才能看到一點紅色背景。那麼如果偏移量設為負值會怎麼樣呢?經過驗證,偏移超出的部分會被截掉而看不到,不信可以自己試一下。有時候這很有用,比如當我想顯示一個半圓的時候。
另外,關于item的用法,也做下總結:
- 根節點不同時,可設定的屬性是會不同的,比如selector下,可以設定一些狀态屬性,而在layer-list下,可以設定偏移量;
- 就算父節點同樣是selector,放在drawable目錄和放在color目錄下可用的屬性也會不同,比如drawable目錄下可用的屬性為android:drawable,在color目錄下可用的屬性為android:color;
- item的子節點可以為任何類型的drawable類标簽,除了上面例子中的shape、color、layer-list,也可以是selector,還有其他沒講過的bitmap、clip、scale、inset、transition、rotate、animated-rotate、lever-list等等。
文章做總結學習筆記用,歡迎關注和點贊?!