【Code-Snippet】Android樣式

概述

今天咱們來探究一下android的樣式。 其實,幾乎全部的控件均可以使用 background屬性去引用自定義的XML樣式,因此研究樣式顯得特別重要。 先來看一段樣式代碼:php

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:innerRadiusRatio="10" android:shape="ring" android:thicknessRatio="9" android:useLevel="false">
            <stroke android:width="1dp" android:color="@android:color/black" />
        </shape>
    </item>
</selector>
複製代碼

說一下一些基本的知識:(我也是剛剛纔知道的)android

<?xml version="1.0" encoding="utf-8"?>bash

  • 這個是聲明瞭XML的版本信息爲1.0,字符編碼爲UTF-8

(一)selector的內屬性

xmlns:android="http://schemas.android.com/apk/res/android"工具

  • 這個是XML的命名空間,也就是有了它,你能夠 alt+/ 做爲提示,不應輸入什麼,什麼是對的,什麼是錯的。

android:visiable佈局

  • true設置該效果改樣式可見

android:autoMirrored動畫

  • true設置單行顯示,例如是TextView有多行文字,那麼只顯示一行,後面顯示...

android:constantSizeui

  • 這個是布爾型,false表示各個狀態的大小(size)各自不一樣,true表中全部的狀態大小相同(以最大的爲準)。默認爲false

android:dither編碼

  • 圖像的抖動處理,當每一個顏色值以低於8位表示時,對應圖像作抖動處理能夠實如今可顯示顏色總數比較低(好比256色)時還保持較好的顯示效

android:enterFadeDurationspa

  • 表示樣式淡入的時間,毫秒

android:exitFadeDuration3d

  • 表示樣式淡出的時間,毫秒

android:variablePadding

  • 布爾型。選擇true時,drawable的內邊距會根據狀態的變化而變化,設置爲true時,你必須爲不一樣的狀態配置layout,可是一般不建議這麼作。選擇false時,內邊距保持一致,全部狀態中最大的內邊距。默認爲false

(二)selector下的標籤:item標籤的內屬性

selector標籤下只有item標籤。item的標籤內屬性以下:都是設置控件在什麼狀態下的樣式:

android:drawable 須要入別的xml,默認是背景圖片

android:state_above_achor

android:state_accelerated 硬件加速true時的效果

android:state_activated true被激活時的效果,false未激活時的效果

android:state_active true激活後的效果

android:state_checkable true,當CheckBox能使用時顯示該圖片

android:state_checked true,當CheckBox選中時顯示該圖片

android:state_drag_can_accept true 可以 drag 拖拽時圖片

android:state_drag_hovered true 可以 drag 鼠標指針移動到該位置圖片

android:state_empty

android:state_enabled true,當該組件能使用時顯示該圖片

android:state_expanded

android:state_first

android:state_focused true非觸摸模式下得到焦點時顯示圖片

android:state_hovered 鼠標移動到該位置時的樣式

android:state_last

android:state_long_pressable 長按的樣式

android:state_middle

android:state_multiline

android:state_pressed 按下的樣式

android:state_selected 選擇時的樣式

android:state_single true 只有一個元素顯示圖片

android:state_window_focused 當此activity得到焦點在最前面時顯示該圖片

(三)item下的標籤

  • color 設置顏色
  • animated-rotate
  • animated-selector
  • animation-list
  • bitmap
  • clip
  • inset
  • layer-list
  • level-list
  • nine-patch
  • ripple
  • rotate
  • scale
  • selector
  • set
  • shape
  • transition

(1)shape標籤

標籤內屬性:

  • visible 是否可見
  • dither 圖像的抖動處理,當每一個顏色值以低於8位表示時,對應圖像作抖動處理能夠實如今可顯示顏色總數比較低(好比256色)時還保持較好的顯示效果
  • innerRadius
  • innerRadiusRatio
  • shape 指定畫的圖形(經常使用)
  • thickness
  • thicknessRatio
  • useLevel

(A)shape=rectangle: 矩形,默認的形狀,能夠畫出直角矩形、圓角矩形、弧形等

  • solid: 設置形狀填充的顏色,只有android:color一個屬性

    • android:color 填充的顏色
  • padding: 設置內容與形狀邊界的內間距,可分別設置左右上下的距離

    • android:left 左內間距
    • android:right 右內間距
    • android:top 上內間距
    • android:bottom 下內間距
  • gradient: 設置形狀的漸變顏色,能夠是線性漸變、輻射漸變、掃描性漸變

    • android:type 漸變的類型
      • linear 線性漸變,默認的漸變類型
      • radial 放射漸變,設置該項時,android:gradientRadius也必須設置
      • sweep 掃描性漸變
    • android:startColor 漸變開始的顏色
    • android:endColor 漸變結束的顏色
    • android:centerColor 漸變中間的顏色
    • android:angle 漸變的角度,線性漸變時纔有效,必須是45的倍數,0表示從左到右,90表示從下到上
    • android:centerX 漸變中心的相對X座標,放射漸變時纔有效,在0.0到1.0之間,默認爲0.5,表示在正中間
    • android:centerY 漸變中心的相對X座標,放射漸變時纔有效,在0.0到1.0之間,默認爲0.5,表示在正中間
    • android:gradientRadius 漸變的半徑,只有漸變類型爲radial時才使用
    • android:useLevel 若是爲true,則可在LevelListDrawable中使用
  • corners: 設置圓角,只適用於rectangle類型,可分別設置四個角不一樣半徑的圓角,當設置的圓角半徑很大時,好比200dp,就可變成弧形邊了

    • android:radius 圓角半徑,會被下面每一個特定的圓角屬性重寫
    • android:topLeftRadius 左上角的半徑
    • android:topRightRadius 右上角的半徑
    • android:bottomLeftRadius 左下角的半徑
    • android:bottomRightRadius 右下角的半徑
  • stroke: 設置描邊,可描成實線或虛線。

    • android:color 描邊的顏色
    • android:width 描邊的寬度
    • android:dashWidth 設置虛線時的橫線長度,0爲實線
    • android:dashGap 設置虛線時的橫線之間的距離,即虛線的間隔大小
  • size:設置組件大小

    • android:width 組件寬
    • android:height 組件高

矩形

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="#0ee"/>
    <corners android:radius="20dp"/>
    <size android:width="100dp" android:height="100dp"/>
    <stroke android:width="2dp" android:color="#000"/>
</shape>
複製代碼

圓形

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="#0ee"/>
    <corners android:radius="50dp"/>
    <size android:width="100dp" android:height="100dp"/>
    <stroke android:width="2dp" android:color="#000"/>
</shape>
複製代碼

(B)shape=oval: 橢圓形,用得比較多的是畫正圓

主要是經過設置padding和size去實現圓的大小,扁正。

  • corners 圓角
  • gradient 漸變色
  • padding 內邊距
  • size 組件大小
  • solid 設置形狀填充的顏色
  • stroke 描邊

橢圓

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:color="#0ee"/>
    <size android:width="200dp" android:height="100dp"/>
    <stroke android:width="2dp" android:color="#000"/>
    <gradient android:type="linear" android:startColor="#fff" android:endColor="#000"/>
</shape>
複製代碼

注意,使用radial漸變時,必須指定漸變的半徑,即android:gradientRadius屬性。

(C)shape=line: 線形,能夠畫實線和虛線,line主要用於畫分割線,是經過stroke和size特性組合來實現的

  • corners 圓角
  • gradient 漸變色
  • padding 內邊距
  • size 組件大小
  • solid 設置形狀填充的顏色
  • stroke 描邊

畫線時,有幾點特性必需要知道的:

  1. 只能畫水平線,畫不了豎線;
  2. 線的高度是經過stroke的android:width屬性設置的;
  3. size的android:height屬性定義的是整個形狀區域的高度;
  4. size的height必須大於stroke的width,不然,線沒法顯示;
  5. 線在整個形狀區域中是居中顯示的;
  6. 線左右兩邊會留有空白間距,線越粗,空白越大;
  7. 引用虛線的view須要添加屬性android:layerType,值設爲」software」,不然顯示不了虛線。

實線

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
    <size android:width="200dp" android:height="100dp"/>
    <stroke android:width="3dp" android:color="#000" />
</shape>
複製代碼

虛線

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
    <size android:width="200dp" android:height="100dp"/>
    <stroke android:width="3dp" android:color="#000" android:dashWidth="6dp" android:dashGap="2dp"/>
</shape>
複製代碼

(D)shape=ring: 環形,能夠畫環形進度條

首先,shape根元素有些屬性只適用於ring類型,先過目下這些屬性吧:

  • android:innerRadius 內環的半徑
  • android:innerRadiusRatio 浮點型,以環的寬度比率來表示內環的半徑,默認爲3,表示內環半 徑爲環的寬度除以3,該值會被android:innerRadius覆蓋
  • android:thickness 環的厚度
  • android:thicknessRatio 浮點型,以環的寬度比率來表示環的厚度,默認爲9,表示環的厚度爲環的寬度除以9,該值會被android:thickness覆蓋
  • android:useLevel 通常爲false,不然可能環形沒法顯示,只有做爲LevelListDrawable使用時才設爲true
  • corners 圓角
  • gradient 漸變色
  • padding 內邊距
  • size 組件大小
  • solid 設置形狀填充的顏色
  • stroke 描邊

普通的環形

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring" android:innerRadius="50dp" android:useLevel="false"
    android:thickness="5dp">
    <solid android:color="#21e1f2"/>
</shape>
複製代碼

(2)layer-list標籤:

layer-list通過一系列的item標籤,從上到下的順序,從低到上把item的效果疊加起來。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等等。

for example,如下是一個白色背景,有灰色陰影的矩形框。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <layer-list>
            <!-- 灰色陰影 -->
            <item android:left="1dp" android:top="2dp">
                <shape>
                    <size android:width="20dp" android:height="10dp"/>
                    <solid android:color="@android:color/darker_gray" />
                    <corners android:radius="10dp" />
                </shape>
            </item>
            <!-- 白色前景 -->
            <item android:bottom="2dp" android:right="1dp">
                <shape>
                    <solid android:color="#FFFFFF" />
                    <corners android:radius="10dp" />
                </shape>
            </item>
        </layer-list>
    </item>
</selector>
複製代碼

(3)bitmap標籤

主要能夠經過bitmap標籤對圖片作一些設置,如平鋪、拉伸或保持圖片原始大小,也能夠指定對齊方式。

  • android:src 必填項,指定圖片資源,只能是圖片,不能是xml定義的drawable資源

  • android:gravity 設置圖片的對齊方式,好比在layer-list中,默認會盡可能填滿整個視圖,致使圖片可能會被拉伸,爲了不被拉伸,就能夠設置對齊方式,可取值爲下面的值,多個取值能夠用 | 分隔:

    • top 圖片放於容器頂部,不改變圖片大小
    • bottom 圖片放於容器底部,不改變圖片大小
    • left 圖片放於容器左邊,不改變圖片大小
    • right 圖片放於容器右邊,不改變圖片大小
    • center 圖片放於容器中心位置,包括水平和垂直方向,不改變圖片大小
    • fill 拉伸整張圖片以填滿容器的整個高度和寬度,默認值
    • center_vertical 圖片放於容器垂直方向的中心位置,不改變圖片大小
    • center_horizontal 圖片放於容器水平方向的中心位置,不改變圖片大小
    • fill_vertical 在垂直方向上拉伸圖片以填滿容器的整個高度
    • fill_horizontal 在水平方向上拉伸圖片以填滿容器的整個寬度
    • clip_vertical 附加選項,裁剪基於垂直方向的gravity設置,設置top時會裁剪底部,設置bottom時會裁剪頂部,其餘狀況會同時裁剪頂部和底部
    • clip_horizontal 附加選項,裁剪基於水平方向的gravity設置,設置left時會裁剪右側,設置right時會裁剪左側,其餘狀況會同時裁剪左右兩側
  • android:antialias 設置是否開啓抗鋸齒

  • android:dither 設置是否抖動,圖片與屏幕的像素配置不一樣時會用到,好比圖片是ARGB 8888的,而屏幕是RGB565

  • android:filter 設置是否容許對圖片進行濾波,對圖片進行收縮或者延展使用濾波能夠得到平滑的外觀效果

  • android:tint 給圖片着色,好比圖片原本是黑色的,着色後能夠變成白色

  • android:tileMode 設置圖片平鋪的方式,取值爲下面四種之一: --disable 不作任何平鋪,默認設置 --repeat 圖片重複鋪滿 --mirror 使用交替鏡像的方式重複圖片的繪製 --clamp 複製圖片邊緣的顏色來填充容器剩下的空白部分,好比引入的圖片若是是白色的邊緣,那麼圖片所在的容器裏除了圖片,剩下的空間都會被填充成白色

  • android:alpha 設置圖片的透明度,取值範圍爲0.0~1.0之間,0.0爲全透明,1.0爲全不透明,API Level最低要求是11,即Android 3.0

  • android:mipMap 設置是否可使用mipmap,但API Level最低要求是17,即Android 4.2

  • android:autoMirrored 設置圖片是否須要鏡像反轉,當佈局方向是RTL,即從右到左佈局時纔有用,API Level 19(Android 4.4)才添加的屬性

  • android:tileModeX 和tileMode同樣設置圖片的平鋪方式,只是這個屬性只設置水平方向的平鋪方式,這是API Level 21(Android 5.0)才添加的屬性

  • android:tileModeY 和tileMode同樣設置圖片的平鋪方式,只是這個屬性只設置垂直方向的平鋪方式,這是API Level 21(Android 5.0)才添加的屬性

  • android:tintMode 着色模式,也是API Level 21(Android 5.0)才添加的屬性

(4)nine-patch標籤

點九圖片文件擴展名爲:.9.png,經過點九圖片能夠作局部拉伸,好比,一張圓角矩形圖片,咱們不想讓它的四個邊角都被拉伸從而致使模糊失真,使用點九圖就能夠控制拉伸區域,讓四個邊角保持完美顯示。畫點九圖通常用Android SDK工具集裏的draw9patch工具,只須要在四條邊畫黑線就能夠了,使用nine-patch標籤能夠對點九圖片作一些設置處理,不過可設置的屬性並很少:

  • android:src 必填項,必須指定點九類型的圖片
  • android:dither 設置是否抖動,圖片與屏幕的像素配置不一樣時會用到,好比圖片是ARGB 8888的,而屏幕是RGB565
  • android:tint 給圖片着色,好比圖片原本是黑色的,着色後能夠變成白色
  • android:tintMode 着色模式,API Level 21(Android 5.0)才添加的屬性
  • android:alpha 設置圖片的透明度,取值範圍爲0.0~1.0之間,0.0爲全透明,1.0爲全不透明,API Level最低要求是11
  • android:autoMirrored 設置圖片是否須要鏡像反轉,當佈局方向是RTL,即從右到左佈局時纔有用,API Level 19(Android 4.4)才添加的屬性

(5)color標籤

color標籤是drawable裏最簡單的標籤了,只有一個屬性:android:color,指定顏色值。這個標籤通常不多用,由於基本均可以經過其餘更方便的方式定義顏色。另外,顏色值通常都在colors.xml文件中定義,其根節點爲resources。

(6)inset標籤

使用inset標籤能夠對drawable設置邊距,其用法和View的padding相似,只不過padding是設置內容與邊界的距離,而inset則能夠設置背景drawable與View邊界的距離。inset標籤的可設置屬性以下:

  • android:drawable 指定drawable資源,若是不設置該屬性,也能夠定義drawable類型的子標籤
  • android:visible 設置初始的可見性狀態,默認爲false
  • android:insetLeft 左邊距
  • android:insetRight 右邊距
  • android:insetTop 頂部邊距
  • android:insetBottom 底部邊距
  • android:inset 設置統一邊距,會覆蓋上面四個屬性,但API Level要求爲21,即Android 5.0

(7)clip標籤

使用clip標籤能夠對drawable進行裁剪,在作進度條時頗有用。經過設置level值控制裁剪多少,level取值範圍爲0~10000,默認爲0,表示徹底裁剪,圖片將不可見;10000則徹底不裁剪,可見完整圖片。看看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時會裁剪左側,其餘狀況會同時裁剪左右兩側

level的設置須要在代碼中動態去設置,假若有這樣的圖片:

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
複製代碼

效果以下:

clip裏面設置的android:gravity="left"能夠理解爲,從右邊開始裁剪,由於,裁剪的範圍值是,0-10000,這裏設置成了5000,也就是裁剪一半,效果如上圖。

(8)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同樣,在代碼中設置level

(9)level-list標籤

當須要在一個View中顯示不一樣圖片的時候,好比手機剩餘電量不一樣時顯示的圖片不一樣,level-list就能夠派上用場了。level-list能夠管理一組drawable,每一個drawable設置一組level範圍,最終會根據level值選取對應的drawable繪製出來。level-list經過添加item子標籤來添加相應的drawable,其下的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放在最前面,那樣全部電量都只匹配第一條了。

(9)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()方法逆向切換。

((TransitionDrawable)drawable).startTransition(500); //正向切換,即從第一個drawable切換到第二個 ((TransitionDrawable)drawable).reverseTransition(500); //逆向切換,即從第二個drawable切換回第一個

(10)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了。

(11)animation-list標籤

經過animation-list能夠將一系列drawable構建成幀動畫,就是將一個個drawable,一幀一幀的播放。經過添加item子標籤設置每一幀使用的drawable資源,以及每一幀持續的時間,可設置的屬性以下:

  • android:oneshot 屬性設置是否循環播放,設爲true時,只播放一輪就結束,設爲false時,則會輪詢播放。
  • android:duration 屬性設置該幀持續的時間,以毫秒數爲單位。
  • animation-list 對應的Drawable類爲AnimationDrawable,要讓動畫運行起來,須要主動調用AnimationDrawable的start()方法。另外,若是在Activity的onCreate()方法裏直接調用start()方法會沒有效果,由於view尚未初始化完成是播放不了動畫的。

示例代碼以下:

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

複製代碼

注意:

  1. 必需要把 animated-list 設置成主標籤
  2. 只有經過 andorid:src 引用才能夠,也就是button類的控件不能這樣設置動畫
  3. 若是控件沒有效果,需在代碼中這樣設置:
  4. 注意內存的消耗,animation-list默認把全部的圖片都加載到內存中,若是是複雜和幀數高的幀動畫切記不能用此方法
private ImageButton hh;
hh = (ImageButton) findViewById(R.id.imageButton);
Drawable drawable = hh.getDrawable();
if (!((AnimationDrawable) drawable).isRunning()) {
    ((AnimationDrawable) drawable).start();
}
複製代碼

(12)animated-rotate

rotate標籤只是將原有的drawable轉個角度變成另外一個drawable,它是靜態的。而animated-rotate則會讓drawable不停地作旋轉動畫。animated-rotate可設置的屬性只有四個:

  • android:drawable 指定drawable資源,若是不設置該屬性,也能夠定義drawable類型的子標籤

  • android:pivotX 旋轉中心的X座標

  • android:pivotY 旋轉中心的Y座標

    旋轉中心的座標,浮點數或是百分比。 浮點數表示相對於drawable的左邊緣距離單位爲px,如5; 百分比表示相對於drawable的左邊緣距離按百分比計算, 如5%; 另外一種百分比表示相對於父容器的左邊緣,如5%p; 通常設置爲50%表示在drawable中心

  • 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" />
複製代碼

注意:

  1. 必需要把 animated-rotate 設置成主標籤
  2. 只有經過 andorid:src 引用才能夠,也就是button類的控件不能這樣設置動畫
  3. 若是控件沒有效果,需在代碼中這樣設置:
private ImageButton hh;
hh = (ImageButton) findViewById(R.id.imageButton);
Drawable drawable = hh.getDrawable();
if (!((Animatable) drawable).isRunning()) {
    ((Animatable) drawable).start();
}
複製代碼
相關文章
相關標籤/搜索