1. 程式人生 > >Android樣式開發——常用標籤

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