Android樣式開發——常用標籤
1.clip標籤
- 使用clip標籤可以對drawable進行裁剪,在做進度條時很有用。通過設定level值控制裁剪多少,level取值範圍為0~10000,預設為0,表示完全裁剪,圖片將不可見;10000則完全不裁剪,可見完整圖片。看看clip標
clip的屬性:
- android:drawable 指定drawable資源,如果不設定該屬性,也可以定義drawable型別的子標籤
- android:clipOrientation 設定裁剪的方向,取值為以下兩個值之一:
horizontal 在水平方向上進行裁剪,條狀的進度條就是水平方向的裁剪
vertical 在垂直方向上進行裁剪
- android:gravity 設定裁剪的位置,可取值如下,多個取值用 | 分隔:
- top 圖片放於容器頂部,不改變圖片大小。當裁剪方向為vertical時,會裁掉圖片底部
- bottom 圖片放於容器底部,不改變圖片大小。當裁剪方向為vertical時,會裁掉圖片頂部
- left 圖片放於容器左邊,不改變圖片大小,預設值。當裁剪方向為horizontal,會裁掉圖片右邊部分
- right 圖片放於容器右邊,不改變圖片大小。當裁剪方向為horizontal,會裁掉圖片左邊部分
- center 圖片放於容器中心位置,包括水平和垂直方向,不改變圖片大小。當裁剪方向為horizontal時,會裁掉圖片左右部分;當裁剪方向為vertical時,會裁掉圖片上下部分
fill 拉伸整張圖片以填滿容器的整個高度和寬度。這時候圖片不會被裁剪,除非level設為了0,此時圖片不可見- center_vertical 圖片放於容器垂直方向的中心位置,不改變圖片大小。裁剪和center時一樣
- center_horizontal 圖片放於容器水平方向的中心位置,不改變圖片大小。裁剪和center時一樣
- fill_vertical 在垂直方向上拉伸圖片以填滿容器的整個高度。當裁剪方向為vertical時,圖片不會被裁剪,除非level設為了0,此時圖片不可見
- fill_horizontal 在水平方向上拉伸圖片以填滿容器的整個寬度。當裁剪方向為horizontal時,圖片不會被裁剪,除非level設為了0,此時圖片不可見
- clip_vertical 附加選項,裁剪基於垂直方向的gravity設定,設定top時會裁剪底部,設定bottom時會裁剪頂部,其他情況會同時裁剪頂部和底部
- clip_horizontal 附加選項,裁剪基於水平方向的gravity設定,設定left時會裁剪右側,設定right時會裁剪左側,其他情況會同時裁剪左右兩側
1.定義clip.xml:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="horizontal"
android:drawable="@drawable/img4clip"
android:gravity="left" />
2.在ImageView中引用:
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_img"
android:src="@drawable/clip" />
3.在程式碼中設定level:
ImageView img = (ImageView) findViewById(R.id.img);
img.getDrawable().setLevel(5000); //level範圍值0~10000
2.level-list標籤
- 當需要在一個View中顯示不同圖片的時候,比如手機剩餘電量不同時顯示的圖片不同,level-list就可以派上用場了。level-list可以管理一組drawable,每個drawable設定一組level範圍,最終會根據level值選取對應的drawable繪製出來。level-list通過新增item子標籤來新增相應的drawable
level-list的item只有三個屬性:
android:drawable 指定drawable資源,如果不設定該屬性,也可以定義drawable型別的子標籤
android:minLevel 該item的最小level值
android:maxLevel 該item的最大level值
舉個栗子
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/battery_low"
android:maxLevel="10"
android:minLevel="0" />
<item
android:drawable="@drawable/battery_below_half"
android:maxLevel="50"
android:minLevel="10" />
<item
android:drawable="@drawable/battery_over_half"
android:maxLevel="99"
android:minLevel="50" />
<item
android:drawable="@drawable/battery_full"
android:maxLevel="100"
android:minLevel="100" />
</level-list>
那麼,當電量剩下10%時則可以設定level值為10,將會匹配第一張圖片:
img.getDrawable().setLevel(10);
item的匹配規則是從上到下的,當設定的level值與前面的item的level範圍匹配,則採用。一般item的新增按maxLevel從小到大排序下來,此時minLevel可以不用指定也能匹配到。如上面程式碼就可以簡化如下:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/battery_low"
android:maxLevel="10" />
<item
android:drawable="@drawable/battery_below_half"
android:maxLevel="50" />
<item
android:drawable="@drawable/battery_over_half"
android:maxLevel="99" />
<item
android:drawable="@drawable/battery_full"
android:maxLevel="100" />
</level-list>
但不能反過來將android:maxLevel=”100”的item放在最前面,那樣所有電量都只匹配第一條了。
3.transition標籤
transition其實是繼承自layer-list的,只是,transition只能管理兩層drawable,另外提供了兩層drawable之間切換的方法,切換時還會有淡入淡出的動畫效果。
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/on" />
<item android:drawable="@drawable/off" />
</transition>
transition標籤生成的Drawable對應的類為TransitionDrawable,要切換時,需要主動呼叫TransitionDrawable的startTransition()方法,引數為動畫的毫秒數,也可以呼叫reverseTransition()方法逆向切換。
//正向切換,即從第一個drawable切換到第二個
((TransitionDrawable)drawable).startTransition(500);
//逆向切換,即從第二個drawable切換回第一個
((TransitionDrawable)drawable).reverseTransition(500);
4.scale標籤
使用scale標籤可以對drawable進行縮放操作,和clip一樣是通過設定level來控制縮放的比例。scale標籤可以設定的屬性如下:
android:drawable 指定drawable資源,如果不設定該屬性,也可以定義drawable型別的子標籤
android:scaleHeight 設定可縮放的高度,用百分比表示,格式為XX%,0%表示不做任何縮放,50%表示只能縮放一半
android:scaleWidth 設定可縮放的寬度,用百分比表示,格式為XX%,0%表示不做任何縮放,50%表示只能縮放一半
android:scaleGravity 設定drawable縮放後的位置,取值和bitmap標籤的一樣,就不一一列舉說明了,不過預設值是left
android:useIntrinsicSizeAsMinimum 設定drawable原有尺寸作為最小尺寸,設為true時,縮放基本無效,API Level最低要求為11
使用的時候,和clip一樣,用法如下:
定義scale.xml:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/img4scale"
android:scaleGravity="left"
android:scaleHeight="50%"
android:scaleWidth="50%"
android:useIntrinsicSizeAsMinimum="false" />
在ImageView中引用:
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_img"
android:src="@drawable/scale" />
在程式碼中設定level:
ImageView img = (ImageView) findViewById(R.id.img);
img.getDrawable().setLevel(5000); //level範圍值0~10000
5.rotate標籤
使用rotate標籤可以對一個drawable進行旋轉操作,在shape篇講環形時最後舉了個進度條時就用到了rotate標籤。另外,比如你有一張箭頭向上的圖片,但你還需要一個箭頭向下的圖片,這時就可以使用rotate將向上的箭頭旋轉變成一張箭頭向下的drawable。
先看看rotate標籤的一些屬性吧:
android:drawable 指定drawable資源,如果不設定該屬性,也可以定義drawable型別的子標籤
android:fromDegrees 起始的角度度數
android:toDegrees 結束的角度度數,正數表示順時針,負數表示逆時針
android:pivotX 旋轉中心的X座標,浮點數或是百分比。浮點數表示相對於drawable的左邊緣距離單位為px,如5; 百分比表示相對於drawable的左邊緣距離按百分比計算,如5%; 另一種百分比表示相對於父容器的左邊緣,如5%p; 一般設定為50%表示在drawable中心
android:pivotY 旋轉中心的Y座標
android:visible 設定初始的可見性狀態,預設為false
示例程式碼如下,目標是將一張箭頭向上的圖片轉180度,轉成一張箭頭向下的圖片:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_arrow"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180" />
將它引用到ImageView裡,發現圖片根本沒有轉變。其實,要讓它可以旋轉,還需要設定level值。level取值範圍為0~10000,應用到rotate,則與fromDegrees~toDegrees相對應,如上面例子的角度範圍為0~180,那麼,level取值0時,則旋轉為0度;level為10000時,則旋轉180度;level為5000時,則旋轉90度。因為level預設值為0,所以圖片沒有轉變。那麼,我們想轉180度,其實可以將fromDegrees設為180,而不設定toDegrees,這樣,不用再在程式碼裡設定level圖片就可以旋轉180了。
6.animation-list標籤
通過animation-list可以將一系列drawable構建成幀動畫,就是將一個個drawable,一幀一幀的播放。通過新增item子標籤設定每一幀使用的drawable資源,以及每一幀持續的時間。
android:oneshot屬性設定是否迴圈播放,設為true時,只播放一輪就結束,設為false時,則會輪詢播放。
android:duration屬性設定該幀持續的時間,以毫秒數為單位。
示例程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@drawable/anim1"
android:duration="1000" />
<item
android:drawable="@mipmap/anim2"
android:duration="1000" />
<item
android:drawable="@mipmap/anim3"
android:duration="1000" />
</animation-list>
animation-list對應的Drawable類為AnimationDrawable,要讓動畫執行起來,需要主動呼叫AnimationDrawable的start()方法。另外,如果在Activity的onCreate()方法裡直接呼叫start()方法會沒有效果,因為view還沒有初始化完成是播放不了動畫的。
7.animated-rotate
rotate標籤只是將原有的drawable轉個角度變成另一個drawable,它是靜態的。而animated-rotate則會讓drawable不停地做旋轉動畫。
animated-rotate可設定的屬性只有四個:
android:drawable 指定drawable資源,如果不設定該屬性,也可以定義drawable型別的子標籤
android:pivotX 旋轉中心的X座標
android:pivotY 旋轉中心的Y座標
android:visible 設定初始的可見性狀態,預設為false
示例程式碼:
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/img_daisy"
android:pivotX="50%"
android:pivotY="50%"
android:visible="false" />