1. 程式人生 > >Android Drawable常見子類及其用法整理

Android Drawable常見子類及其用法整理

概述 Drawable是一個抽象類,是對可繪製物件的抽象。與View不同的是Drawable沒有事件和互動方法。Drawable有很多子類操作具體資源型別,比如BitmapDrawable操作點陣圖,ColorDrawable操作顏色,ClipDrawable操作剪下板。 參考資料:《Android開發藝術探索》 原理
  • draw(Canvas canvas)    //在draw中對畫布進行繪製
  • setBounts()                   //制定繪製邊界
Drawable使用簡單,比自定義View成本低;非圖片型別的Drawable佔用空間少,對減少apk大小很有幫助。 Drawable一般通過xml檔案定義,也可以通過程式碼建立具體的Drawable物件。 BitmapDrawable
是對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  設定填充顏色