Android樣式開發--drawable總結
普通圖片
密度分類 | 密度值範圍 | 代表解析度 | 圖示尺寸 | 圖片比例 |
---|---|---|---|---|
mdpi | 120~160dpi | 320x480px | 48x48px | 1 |
hdpi | 160~240dpi | 480x800px | 72x72px | 1.5 |
xhdpi | 240~320dpi | 720x1280px | 96x96px | 2 |
xxhdpi | 320~480dpi | 1080x1920px | 144x144px | 3 |
xxxhdpi | 480~640dpi | 1440x2560px | 192x192px | 4 |
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)才新增的屬性
點九圖片
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)才新增的屬性
color標籤
<!-- 檔案:res/drawable/white.xml --> <color xmlns:android="http://schemas.android.com/apk/res/android" android:color="#FFFFFF" />
<!-- 檔案:res/values/colors.xml --> <resources> <color name="white">#FFFFFF</color> </resources>
inset標籤
- android:drawable 指定drawable資源,如果不設定該屬性,也可以定義drawable型別的子標籤
- android:visible 設定初始的可見性狀態,預設為false
- android:insetLeft 左邊距
- android:insetRight 右邊距
- android:insetTop 頂部邊距
- android:insetBottom 底部邊距
- android:inset 設定統一邊距,會覆蓋上面四個屬性,但API Level要求為21,即Android 5.0
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時會裁剪左側,其他情況會同時裁剪左右兩側
-
定義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" />
-
在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" />
-
在程式碼中設定level:
ImageView img = (ImageView) findViewById(R.id.img); img.getDrawable().setLevel(5000); //level範圍值0~10000
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
-
定義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
level-list標籤
- 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>
img.getDrawable().setLevel(10);
<?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>
transition標籤
<?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>
((TransitionDrawable)drawable).startTransition(500); //正向切換,即從第一個drawable切換到第二個 ((TransitionDrawable)drawable).reverseTransition(500); //逆向切換,即從第二個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
<?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" />
animation-list標籤
<?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>
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" />