你都知道么?Android中21种drawable标签大全
前言
我們在drawable目錄下可以創建很多自定義的資源,其中用的最多的應該就是selector和shape。目前在Android中有21種drawable標簽,了解和利用這些標簽對我們的開發有很大的幫助。這個文章我們對這21種標簽做一個介紹,讓大家有一個印象。
本文中有些資料取自網上,當時記錄在筆記中,但是由于時間久遠,忘記出處了。
shape
這個大家非常熟悉,簡單列舉一下屬性和子標簽,至于子標簽的屬性和具體使用就不細說了,網上有的是
自身屬性
android:dither 是否啟動圖片抖動
android:shape 形狀。分別為矩形、線、橢圓、環。默認為矩形rectangle
當為line時,一定要有stroke,實線虛線都可以,但是只能是橫線,并且局中,主要用于分割線
android:tint 給shape著色
android:tintMode 著色類型(蒙版類型)
android:visible
//下面這五個屬性是shape為ring,即圓環是才使用的
android:innerRadius
android:innerRadiusRatio
android:thickness
android:thicknessRatio
android:useLevel
子標簽
solid填充顏色
corners圓角
stroke描邊
padding邊距
size長寬
gradient漸變
selector
選擇器,也很常用,設置不同狀態下不同的drawable。
屬性
android:dither 是否啟動圖片抖動
android:visible
android:enterFadeDuration 狀態改變時,新狀態展示時的淡入時間,以毫秒為單位
android:exitFadeDuration 狀態改變時,舊狀態消失時的淡出時間,以毫秒為單位
android:autoMirrored 設置圖片是否需要鏡像反轉,當布局方向是RTL,即從右到左布局時才有用,API Level 19(Android 4.4)才添加的屬性
在某些語言下如阿拉伯語習慣是從右到左,在manifest的application中需要設置android:supportsRtl,另外在組件中還有兩個相關屬性android:layoutDirection和android:textDirection
android:variablePadding (基本不用)選擇true時,drawable的內邊距會根據狀態的變化而變化,設置為true時,你必須為不同的狀態配置layout,但是通常不建議這么做。選擇false時,內邊距保持一致,所有狀態中最大的內邊距。
android:constantSize 當選擇器各個狀態的圖片大小不一時,設置為 true表示以最大的圖片的尺寸顯示,設置為false以默認的圖片的尺寸顯示
子標簽
item 該標簽下可以定義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
子標簽
當不設定android:drawable時,可以添加任意drawable的子標簽,比如shape(其實也可以將shape單獨放一個xml文件中,然后用android:drawable設定,其實是一樣的,只不過直接通過shape標簽可以減少一個文件),這樣在通過旋轉可以實現某些圖形,如三角形。但是比較麻煩,也不常用,這里就不細說了。
bitmap
屬性
android:src 必填項,指定圖片資源,只能是圖片,不能是xml定義的drawable資源(所以svg不行)
android:gravity 設置圖片的對齊方式,比如在layer-list中,默認是填滿整個視圖則會拉伸,用這個值。多個取值可以用 | 分隔:
android:antialias 設置是否開啟抗鋸齒
android:dither 設置是否抖動,圖片與屏幕的像素配置不同時會用到,比如圖片是ARGB 8888的,而屏幕是RGB565
android:filter 設置是否允許對圖片進行濾波,對圖片進行收縮或者延展使用濾波可以獲得平滑的外觀效果
android:tint 著色
android:tileMode 設置圖片平鋪的方式,其中clamp復制圖片邊緣的顏色來填充容器剩下的空白部分
android:alpha 透明度
android:mipMap 設置是否可以使用mipmap,但API Level最低要求是17,即Android 4.2
android:autoMirrored 設置圖片是否需要鏡像反轉,上面提到了
android:tileModeX 設置水平方向的平鋪方式,這是API Level 21(Android 5.0)才添加的屬性
android:tileModeY 設置垂直方向的平鋪方式,這是API Level 21(Android 5.0)才添加的屬性
android:tintMode 著色模式,也是API Level 21(Android 5.0)才添加的屬性
nine-patch
屬性
android:src 必填項,必須指定點九類型的圖片 xxx.9.png
其他屬性與bitmap完全一樣,不復述了。
color
屬性
只有一個android:color屬性,因為可以直接在color.xml設置顏色,所以這個用處不多。
inset
設置邊距,注意這個邊距不是指內容與view邊界的padding(如shape中的padding),而是drawable與view邊界的距離
比如做背景時,無論怎么設置view的padding,圖案都是完整填充view的,設置了這個之后就可以讓圖案四周留出空白。
屬性
android:drawable 指定drawable資源,如果不設置該屬性,也可以定義drawable類型的子標簽
android:visible 設置初始的可見性狀態,默認為false
android:insetLeft 左邊距
android:insetRight 右邊距
android:insetTop 頂部邊距
android:insetBottom 底部邊距
android:inset 設置統一邊距,會覆蓋上面四個屬性,但API Level要求為21,即Android 5.0
子標簽
如果不設置drawable屬性,也可以定義drawable類型的子標簽,如shape等
clip
使用clip標簽可以對drawable進行裁剪,在做進度條時很有用。通過設置level值控制裁剪多少,level取值范圍為0~10000,默認為0,表示完全裁剪,圖片將不可見;10000則完全不裁剪,可見完整圖片。
屬性
android:drawable 指定drawable資源,如果不設置該屬性,也可以定義drawable類型的子標簽
android:clipOrientation 設置裁剪的方向
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時會裁剪左側,其他情況會同時裁剪左右兩側
子標簽
如果不設置drawable屬性,也可以定義drawable類型的子標簽,如shape等
注意
必須設置level才會生效,而level只能在代碼中設置,ImageView.setImageLevel()。除了用于進度條,配合屬性動畫可以實現圖片各種效果的逐漸展示。
scale
與clip類似,也需要設置level值,0-10000,10000是原大小,但是可以設置超過10000的值,則為放大。
屬性
android:drawable 指定drawable資源,如果不設置該屬性,也可以定義drawable類型的子標簽
android:scaleHeight 設置可縮放的高度,用百分比表示,格式為XX%,0%表示不做任何縮放,50%表示只能縮放一半
android:scaleWidth 設置可縮放的寬度,用百分比表示,格式為XX%,0%表示不做任何縮放,50%表示只能縮放一半
android:scaleGravity 設置drawable縮放后的位置,取值和bitmap標簽的一樣,就不一一列舉說明了,不過默認值是left
android:useIntrinsicSizeAsMinimum 設置drawable原有尺寸作為最小尺寸,設為true時,縮放無效
android:level 要求api>=24,但是設置沒有效果,待研究
子標簽
如果不設置drawable屬性,也可以定義drawable類型的子標簽,如shape等
level-list
當需要在一個View中顯示不同圖片的時候,比如手機剩余電量不同時顯示的圖片不同,level-list就可以派上用場了。level-list可以管理一組drawable,每個drawable設置一組level范圍,最終會根據level值選取對應的drawable繪制出來。
子標簽
item
item的屬性有
android:drawable 指定drawable資源,如果不設置該屬性,也可以定義drawable類型的子標簽
android:minLevel 該item的最小level值
android:maxLevel 該item的最大level值
通過level-list我們就可以不用在使用if-else來動態改變圖片或者背景了,直接改變level就可以了。
layer-list
這個也比較常用,主要是將幾個drawable疊加在一起,通過簡單的drawable實現復雜的圖形。
屬性
android:autoMirrored 自動鏡像,上面解釋過,api>=19
android:opacity 透明模式,根據官方注釋理解設置了這個時候,子標簽對應的這個屬性都失效,沒測試過
android:paddingMode 堆疊模式,api>=21。有兩種模式
- nest是默認的,將每一層都嵌套到上一層中,所以上一層的padding對這一層有效果
- stack將每一層直接堆疊在上一層上,上一個的padding對本層無效果
簡單解釋一下,假設第一層是shape,設置了android:left=“10dp”。在nest模式下第二層是從左邊10dp才開始填充,而在stack模式下第二層是從左邊0dp開始填充。
android:paddingXXX 設置內容邊距(如設置為背景時)
子標簽
item 該標簽下可以定義drawable類型的子標簽
transition
transition其實是繼承自layer-list的transition只能管理兩層drawable(多余的item無效),提供了兩層drawable之間切換的方法,切換時還會有淡入淡出的動畫效果。
屬性
都是繼承layer-list,且都無效
子標簽
item 該標簽下可以定義drawable類型的子標簽
注意
在代碼中,transition標簽生成的Drawable對應的類為TransitionDrawable,要切換時,需要主動調用TransitionDrawable的startTransition()方法,參數為動畫的毫秒數,也可以調用reverseTransition()方法逆向切換。
((TransitionDrawable)drawable).startTransition(500);//正向切換,即從第一個drawable切換到第二個
((TransitionDrawable)drawable).reverseTransition(500);//逆向切換,即從第二個drawable切換回第一個
animation-list
通過animation-list可以將一系列drawable構建成幀動畫,就是將一個個drawable,一幀一幀的播放。
屬性
android:visible
android:oneshot 是否循環播放
android:variablePadding 上面提到過
子標簽
item 該標簽下可以定義drawable類型的子標簽。item的屬性有drawable和duration
animation-rotate
這個很好理解,就是讓一個drawable以某處為中心不停地做旋轉動畫,沒旋轉角度和時間,比如加載動畫。
屬性
android:drawable 指定drawable資源,如果不設置該屬性,也可以定義drawable類型的子標簽
android:pivotX 旋轉中心的X坐標
android:pivotY 旋轉中心的Y坐標
android:visible 設置初始的可見性狀態,默認為false
子標簽
如果不設置drawable屬性,也可以定義drawable類型的子標簽,如shape等
以下是android5.0新增標簽
vector
svg矢量圖
屬性
android:name 名稱
android:width Drawable寬度
android:height Drawable的高度
android:viewportWidth 定義矢量圖形的視圖(viewport)空間的寬度,viewport是一個虛擬的canvas,這不是drawable的寬度,是指這個坐標系橫向最大的數值,即將drawable橫向分成多少份。
android:viewportHeight 定義矢量圖形的可視區域的高度。
android:tint 著色
android:tintMode 著色模式
android:autoMirrored 自動鏡像,上面提到過
android:alpha 透明度,取值0~1
子標簽:
group: 可以包含子group和path。它的屬性:
- android:name
- android:rotation 旋轉
- android:pivotX 旋轉和縮放時的中心點的X軸坐標。取值基于viewport視圖的坐標系,不能使用百分比。
- android:pivotY 旋轉和縮放時的中心點的Y軸坐標。取值基于viewport視圖的坐標系,不能使用百分比。
- android:scaleX 在X軸上的縮放比例,最先應用到圖形上。
- android:scaleY 在Y軸上的縮放比例,最先應用到圖形上。
- android:translateX 在X軸的平移距離,取值基于viewport視圖的坐標系。最后應用到圖形上。
- android:translateY 在Y軸的平移距離,取值基于viewport視圖的坐標系。最后應用到圖形上。
path:路徑,它的屬性: - android:name
- android:pathData 路徑的數據。主要屬性,數據格式比較復雜,不在這細說了。
- android:fillColor 填充路徑的顏色,在SDK24及以上,可以指定一個顏色狀態列表或者一個漸變的顏色。如果在此屬性上做漸變動畫,新的屬性值會覆蓋此值。
- android:strokeColor 指定路徑線條的顏色,在SDK24及以上,可以指定一個顏色狀態列表或者一個漸變的顏色。如果在此屬性上做漸變動畫,新的屬性值會覆蓋此值。
- android:strokeWidth 指定路徑線條的寬度,基于viewport視圖的坐標系
- android:strokeAlpha 指定路徑線條的透明度
- android:fillAlpha 指定填充區域的透明度
- android:trimPathStart 取值從0到1,表示路徑從哪里開始繪制。0~trimPathStart區間的路徑不會被繪制出來。
- android:trimPathEnd 取值從0到1,表示路徑繪制到哪里。trimPathEnd~1區間的路徑不會被繪制出來。
- android:trimPathOffset 平移可繪制區域,取值從0到1,線條從trimPathOffset+trimPathStart繪制到trimPathOffset+trimPathEnd,注意:trimPathOffset+trimPathEnd如果超過1,其實也是繪制的的,繪制的是0~trimPathOffset+trimPathEnd-1的位置。
- android:strokeLineCap 設置線條首尾的外觀,三個值:butt(默認,向線條的每個末端添加平直的邊緣), round(向線條的每個末端添加圓形線帽), square(向線條的每個末端添加正方形線帽。)。
- android:strokeLineJoin 設置當兩條線條交匯時,創建什么樣的邊角(線段連接類型):三個值:miter(默認,創建尖角),round(創建圓角),bevel(創建斜角) 。
- android:strokeMiterLimit 設置設置最大斜接長度,斜接長度指的是在兩條線交匯處內角和外角之間的距離。只有當 lineJoin 屬性為 “miter” 時,miterLimit 才有效。
- android:fillType 設置路徑的填充類型
clip-path: 只有在剪切路徑內的才會顯示出來,它的屬性: - android:name
- android:pathData 裁切路徑,取值與上面講的pathData相同。
animated-vector
svg矢量動畫,需要配合動畫xml(anim、animator)使用。
屬性
android:drawable svg矢量圖,即VectorDrawable
子標簽:
target: 它的屬性
- android:name vector中group或path的name
- android:animation group或path執行的動畫,anim或animator
說明
舉個列子簡單來說一下,假設我們想讓菜單icon(三條橫線)變成后退icon(箭頭)
首先我們要定義一個VectorDrawable,其中包含多條path或group,例子中是三個path,即三條橫線。
然后需要定義幾個anim或animator,例子中需要定義兩個動畫,分別是逆時針和順時針旋轉的動畫
最好定義animated-vector,這樣執行時可以看到上下兩條橫線旋轉與中間橫線交接,由菜單icon轉成了后退icon。
這里注意,當我們使用animator直接改變pathData的時候,比如:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="500"android:propertyName="pathData"android:valueFrom="M20,20L80,20"android:valueTo="M50,20L80,50"android:valueType="pathType" />一定要將valueType顯式設置為pathType,否則會crash,且沒有crash日志。
另外經測試,在valueFrom和valueTo中的path格式要一一對應,否則也會crash,也沒有日志,我的理解是因為無法計算出動畫數據。
比如:
android:valueFrom="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z" android:valueTo="M4,0h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L0,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z"這樣就沒問題,因為path的每小段的數據都是完全對應,只是每個小部分中的數值有變化
而:
android:valueFrom="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z" android:valueTo="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM9,17L7,17v-7h2v7zM13,17h-2L11,7h2v10zM17,17h-2v-4h2v4z"則會crash,因為path的數據完全對應不上,無法計算出動畫的中間數據
ripple
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的你都知道么?Android中21种drawable标签大全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文搞懂RSA算法原理及简单实现
- 下一篇: Android录制和播放PCM数据