Android Drawable常見子類及其用法整理
阿新 • • 發佈:2018-12-26
概述
Drawable是一個抽象類,是對可繪製物件的抽象。與View不同的是Drawable沒有事件和互動方法。Drawable有很多子類操作具體資源型別,比如BitmapDrawable操作點陣圖,ColorDrawable操作顏色,ClipDrawable操作剪下板。
參考資料:《Android開發藝術探索》
原理
是對bitmap的一種封裝,可以設定它包裝的bitmap在BitmapDrawable區域內的繪製方式。如平鋪填充、拉伸填充、或保持圖片原始大小
xml標籤:<bitmap/>
常用屬性:
android:src 根據id引用圖片資源
android:antialias 是否開啟抗鋸齒。開啟後圖片邊緣變得平滑,同時會在一定程度上降低圖片清晰度。建議開啟
android:dither 是否開啟防抖動效果。當圖片畫素配置與手機螢幕畫素配置不一致時,開啟能讓高質量的圖片在低質量的螢幕上保持較好的顯示效果。建議開啟
android:filter 是否開啟過濾效果。當圖片尺寸被拉伸或者壓縮時,開啟可以保持較好的顯示效果。建議開啟
android:gravity 當圖片尺寸小於容器尺寸時,對圖片位置進行定位。(top、bottom、center_vertical等 可用 ' | '進行組合使用)
android:mipMap 紋理對映。預設值為false,不常用。
android:tileMode 平鋪模式。值如下:
disable 關閉平鋪模式,預設值。開啟後,gravity屬性會被忽略。
repeat 重複,簡單的水平和豎直方向上平鋪效果。
clamp 圖片顏色向著水平和垂直兩個方向區域擴充套件
NinePatchDrawable
對 .9 格式圖片進行封裝,.9 格式圖片可根據所需寬高進行相應縮放而不失真。使用方法屬性同BtimapDrawable
xml節點:<nine-patch/>
ShapeDrawable
可理解為通過顏色來構造的圖形,圖片效果可為純色或漸變。
xml標籤:<shape/>
常用屬性或標籤:
android:shape 表示圖形的形狀。值如下
rectangle 矩形
oval 橢圓
line 橫線
ring 圓環
其中line和ring需指定<stroke>標籤設定線的寬度和顏色等資訊。
<corners/> 表示shape四個角的角度
<gradient/> 漸變效果。
android:angle 漸變的角度,預設為0,其值必須為45的倍數,0表示從左到右,90表示從上到下 角度影響漸變方向
android:centerX 漸變中心點的橫座標,centerY同理
android:startColor 漸變起始色,同理centerColor、endColor
android:gradientRadius 漸變半徑,僅當 android:type="radial"時有效
android:useLevel 一般為false,當Drawable作為StateListDrawable時為true ???
android:type 漸變型別,有linear(線性漸變,預設)、radial(徑向漸變)、sweep(掃描線漸變)
<solid/> 表示純色填充,android:color 指定填充顏色
<stroke/> 描邊。
android:width 描邊的寬度
android:color 顏色
//下面屬性有任何一個為0,虛線效果將不能生效
android:dashWidth 組成虛線的線段的長度
android:dashGap 組成虛線的線段的間隔
<padding/> 空白。表示的不是shape的空白,而是包含它的View的空白。
<size/> shape的大小。
LayerDrawable
表示一種層次化的Drawable集合,通過將不同的Drawable放置在不同的層面從而達到一種疊加後的效果。
一個list-list包含多個item,每個item表示一個Drawable。
item的屬性有android:top、android:bottom、android:left、android:right、表示drawable相對於View的偏移量, 單位為畫素。
在item中可以利用android:drawble直接引用已有drawable,也可以自定義。
下層覆蓋上層。
xml標籤:<layer-list/>
例:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/background"
android:drawable="@drawable/grow"/>
<item android:id="@android:id/progress"
android:drawable="@drawable/ok"/>
<item>
<bitmap android:src="@drawable/icon"
android:gravity="center"/>
</layer-list>
StateListDrawable
也表示Drawable的集合,每個Drawable對應View的一種狀態,系統根據View的狀態選擇合適的Drawable。主要用於可單擊改變的View背景,如Button。
xml標籤:<selector/>
常用屬性:
android:constantSize 固有大小是否可以改變。狀態改變會使StateListDrawable切換到具體的Drawable,而不同的Drawable可能大小不同,為true StateListDrawable大小保持不變,為false隨著狀態改變而改變。
android:dither 是否開啟防抖動效果。預設為true。
android:variablePadding 設定StateListDrawable的padding是否隨著其狀態改變而改變。預設為false,不建議開啟。
<item/> item標籤表示一個具體的Drawable
android:drawable 引用一個已有的Drawable資源
View的常見狀態:
android:state_pressed 表示按下狀態(按下仍為鬆開)
android:state_focused View已經獲得焦點
android:state_selected View已經被選擇
android:state_ checked View被選中,一般適用於CheckBox類控制元件,具有選中與非選中狀態的View
android:state_ enabled View當前處於可用狀態
例:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/button_pressed" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/button_focused" /> <!-- focused -->
<item android:drawable="@drawable/button_normal" /> <!-- default-->
LevelListDrawable
同樣表示一個Drawable集合,集合中每個Drawable都有一個等級(Level)。根據不同的等級,LevelListDrawable會切換到對應的Drawable。
xml標籤:<level-list/>
屬性:
<item/>
android:maxLevel 最大等級
android:minLevel 最小等級
通過Drawable的setLevel方法來設定不同的等級從而切換到具體的Drawable
範圍:0~10000 預設值為0
TransitionDrawable
實現兩個Drawable之間淡入淡出的效果。
xml標籤:<transition/>
例:
//res/drawable/transition_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable1" />
<item android:drawable="@drawable2" />
</transition>
將以上drawable設定為view的背景之後,
TransitionDrawable drawable = (TransitionDrawable)view.getBackground();
drawable.startTransition(1000); //開始效果,1000為持續時間
drawable.reverseTransition(); //逆過程,兩個drawable切換順序相反
InsetDrawable
可以將其他的Drawable內嵌到自己當中,並可以在四周留出一定的間距。通過LayerDrawable也可以實現類似效果。當控制元件需要的背景比實際的邊框小的時候比較適合使用InsetDrawable。
xml標籤:<inset/>
常用屬性:
android:drawable 引用一個drawable資源
android:visible 設定Drawable是否可見
android:insetTop 與頂部的距離
android:insetRight 與右邊的距離
android:insetBottom 與底部的距離
android:insetLeft 與左邊的距離
android:inset 當上下左右距離一致的時候,使用android:inset可以簡化設定。(要求API level 大於21)
ScaleDrawable
根據自己的等級(level)將指定的Drawable縮放到一定的比例。
xml標籤:<scale>
屬性:
android:drawable 引用一個drawable資源
android:scaleGravity 含義同shape中android:gravity
android:scaleHeight 高度縮放比例,如25%
android:scaleWidth 寬度縮放比例
如果ScaleDrawable的級別越大,那麼內部的Drawable看起來就越大;如果ScaleDrawable的xml所定義縮放比例越大,那麼內部的Drawable看起來就越小。
使用時需指定等級:
ScaleDrawable drawable = (ScaleDrawable)view.getBackground();
drawable.setLevel(1); //預設等級為0,此時ScaleDrawable無法顯示 範圍: >0 && <=10000
ClipDrawable
根據當前自己的等級來裁剪一個Drawable。(進度條實現方式)
xml標籤:<clip/>
屬性:
android:clipOrientation 裁剪方向,horizontal或者vertical
android:gravity 指定裁剪時的對齊方式
使用ClipDrawable物件時可呼叫setLevel(int level)方法來設定擷取的區域大小,當level為0時,擷取的圖片片段為空;當level為10000時,擷取整張圖片。
ColorDrawable
一個專門用指定顏色來填充畫布的Drawable,需要注意的是,使用ColorDrawable時會忽略ColorFilter
xml標籤:<color/>
主要屬性:
android:color 設定填充顏色
- draw(Canvas canvas) //在draw中對畫布進行繪製
- setBounts() //制定繪製邊界