前言
文章中內(nèi)容多來(lái)自谷歌官方文檔詳戳贩挣,一些示例代碼詳戳GitHub狡蝶,不喜請(qǐng)輕噴佳吞。
可繪制對(duì)象資源
可繪制對(duì)象資源是一般概念,是指可在屏幕上繪制的圖形魔眨,以及可以使用 getDrawable(int) 等 API 檢索或者應(yīng)用到具有 android:drawable 和 android:icon 等屬性的其他 XML 資源的圖形媳维。共有多種不同類(lèi)型的可繪制對(duì)象:
- 位圖文件
位圖圖形文件(.png酿雪、.jpg 或 .gif)。創(chuàng)建 BitmapDrawable侄刽。 - 九宮格文件
具有可拉伸區(qū)域的 PNG 文件指黎,允許根據(jù)內(nèi)容調(diào)整圖像大小 (.9.png)。創(chuàng)建 NinePatchDrawable州丹。 - 圖層列表
管理其他可繪制對(duì)象陣列的可繪制對(duì)象醋安。它們按陣列順序繪制,因此索引最大的元素繪制在頂部当叭。創(chuàng)建 LayerDrawable茬故。 - 狀態(tài)列表
此 XML 文件為不同狀態(tài)引用不同位圖圖形(例如,按下按鈕時(shí)使用不同的圖像)蚁鳖。創(chuàng)建 StateListDrawable磺芭。 - 級(jí)別列表
此 XML 文件用于定義管理大量備選可繪制對(duì)象的可繪制對(duì)象,每個(gè)可繪制對(duì)象都分配有最大的備選數(shù)量醉箕。創(chuàng)建 LevelListDrawable钾腺。 - 轉(zhuǎn)換可繪制對(duì)象
此 XML 文件用于定義可在兩種可繪制對(duì)象資源之間交錯(cuò)淡出的可繪制對(duì)象。創(chuàng)建 TransitionDrawable讥裤。 - 插入可繪制對(duì)象
此 XML 文件用于定義以指定距離插入其他可繪制對(duì)象的可繪制對(duì)象放棒。當(dāng)視圖需0要小于視圖實(shí)際邊界的背景可繪制對(duì)象時(shí),此類(lèi)可繪制對(duì)象很有用己英。 - 裁剪可繪制對(duì)象
此 XML 文件用于定義對(duì)其他可繪制對(duì)象進(jìn)行裁剪(根據(jù)其當(dāng)前級(jí)別值)的可繪制對(duì)象间螟。創(chuàng)建 ClipDrawable。 - 縮放可繪制對(duì)象
此 XML 文件用于定義更改其他可繪制對(duì)象大兴鸶亍(根據(jù)其當(dāng)前級(jí)別值)的可繪制對(duì)象厢破。創(chuàng)建 ScaleDrawable - 形狀可繪制對(duì)象
此 XML 文件用于定義幾何形狀(包括顏色和漸變)。創(chuàng)建 ShapeDrawable治拿。
另請(qǐng)參閱動(dòng)畫(huà)資源文檔摩泪,了解如何創(chuàng)建 AnimationDrawable。
注:顏色資源也可用作 XML 中的可繪制對(duì)象劫谅。例如见坑,在創(chuàng)建狀態(tài)列表可繪制對(duì)象時(shí),可以引用 android:drawable 屬性的顏色資源 (android:drawable="@color/green")
shape
shape顧名思義就是形狀的意思捏检,在我們平時(shí)的開(kāi)發(fā)中荞驴,應(yīng)用的頻率也很高,該文件是一個(gè)xml文件贯城,并放在drawale文件夾下如res/drawable/filename.xml熊楼, 那么引用方式也很簡(jiǎn)單了,我們一般在控件的background使用冤狡,如android:background="@drawable/filename"孙蒙。所有屬性如下
<?xml version="1.0" encoding="utf-8"?>
<!-- shape必須為根元素
xmlns:命名空間
android:shape指定形狀類(lèi)型
rectangle:填充包含視圖的矩形,當(dāng)不寫(xiě)該屬性時(shí)默認(rèn)此形狀
oval:橢圓形狀
line:線形狀悲雳,此形狀需要 <stroke> 元素定義線寬
ring:環(huán)形
當(dāng)android:shape="ring"時(shí)挎峦,有可選屬性
android:innerRadius:尺寸。環(huán)內(nèi)部(中間的孔)的半徑
android:innerRadiusRatio:浮點(diǎn)型合瓢。環(huán)內(nèi)部的半徑坦胶,以環(huán)寬度的比率表示。例如熙含,如果 android:innerRadiusRatio="5"苫拍,則內(nèi)半徑等于環(huán)寬度除以 5葵第。此值被 android:innerRadius 覆蓋。默認(rèn)值為 9纪岁。
android:thickness:環(huán)的厚度
android:thicknessRatio:浮點(diǎn)型。環(huán)的厚度则果,表示為環(huán)寬度的比率幔翰。例如,如果 android:thicknessRatio="2"西壮,則厚度等于環(huán)寬度除以 2遗增。此值被 android:innerRadius 覆蓋。默認(rèn)值為 3款青。
需要注意的是做修,如果你使用了上面幾個(gè)屬性繪制一個(gè)圓,會(huì)發(fā)現(xiàn)在控件中并沒(méi)有效果抡草,我們還需要一個(gè)重要屬性
android:useLevel:布爾值饰及。如果這用作 LevelListDrawable,則此值為“true”渠牲。這通常應(yīng)為“false”旋炒,否則形狀不會(huì)顯示。
-->
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle" | "oval" | "line" | "ring"] >
<!--
corners為形狀產(chǎn)生圓角签杈,僅當(dāng)形狀為矩形時(shí)使用
android:radius:尺寸瘫镇。所有角的半徑,以尺寸值或尺寸資源表示答姥。對(duì)于每個(gè)角铣除,這會(huì)被以下屬性覆蓋。
android:topLeftRadius:左上角的半徑鹦付,以尺寸值或尺寸資源表示尚粘。
android:topRightRadius:右上角的半徑,以尺寸值或尺寸資源表示敲长。
android:bottomLeftRadius:左下角的半徑郎嫁,以尺寸值或尺寸資源表示秉继。
android:bottomRightRadius:右下角的半徑,以尺寸值或尺寸資源表示
-->
<corners
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<!--
指定形狀的漸變顏色泽铛,使用漸變時(shí)不要使用solid尚辑,否則會(huì)被覆蓋,看不到效果
android:angle:整型盔腔。漸變的角度(度)杠茬。0 為從左到右,90 為從上到上弛随。必須是 45 的倍數(shù)瓢喉。默認(rèn)值為 0,如果寫(xiě)該值不是45的整數(shù)倍舀透,將沒(méi)有效果栓票。
android:centerX:浮點(diǎn)型。漸變中心的相對(duì) X 軸位置 (0 - 1.0)盐杂。
android:centerY:浮點(diǎn)型逗载。漸變中心的相對(duì) Y 軸位置 (0 - 1.0)。
android:centerColor:顏色链烈。起始顏色與結(jié)束顏色之間的可選顏色厉斟,以十六進(jìn)制值或顏色資源表示。
android:endColor:顏色强衡。結(jié)束顏色擦秽,表示為十六進(jìn)制值或顏色資源。
android:gradientRadius:浮點(diǎn)型漩勤。漸變的半徑感挥。僅在 android:type="radial" 時(shí)適用。且radial時(shí)必須有該屬性越败,否則無(wú)效果
android:startColor:顏色触幼。起始顏色,表示為十六進(jìn)制值或顏色資源究飞。
android:type:要應(yīng)用的漸變圖案的類(lèi)型置谦。有效值為
"linear" 線性漸變。這是默認(rèn)值亿傅。
"radial" 徑向漸變媒峡。起始顏色為中心顏色。
"sweep" 流線型漸變葵擎。
android:useLevel:布爾值谅阿。如果這用作 LevelListDrawable,則此值為“true”。
-->
<gradient
android:angle="integer"
android:centerX="float"
android:centerY="float"
android:centerColor="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["linear" | "radial" | "sweep"]
android:useLevel=["true" | "false"] />
<!--
要應(yīng)用到包含視圖元素的內(nèi)邊距(這會(huì)填充視圖內(nèi)容的位置签餐,而非形狀)寓涨。
android:left:尺寸。左內(nèi)邊距氯檐,表示為尺寸值或尺寸資源
android:top:尺寸缅茉。上內(nèi)邊距,表示為尺寸值或尺寸資源
android:right:尺寸男摧。右內(nèi)邊距,表示為尺寸值或尺寸資源
android:bottom:尺寸译打。下內(nèi)邊距耗拓,表示為尺寸值或尺寸資源
-->
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer" />
<!--
指定形狀的大小
注:默認(rèn)情況下,形狀按照此處定義的尺寸按比例縮放至容器視圖的大小奏司。在 ImageView 中使用形狀時(shí)乔询,可通過(guò)將 android:scaleType 設(shè)置為 "center" 來(lái)限制縮放。
-->
<size
android:width="integer"
android:height="integer" />
<!---
用于填充形狀的顏色
android:color:顏色韵洋。應(yīng)用于形狀的顏色
->
<solid
android:color="color" />
<!--
形狀的筆劃中線竿刁。即形狀的邊框
android:width:尺寸。線寬搪缨,以尺寸值或尺寸資源表示食拜。
android:color:顏色。線的顏色副编,表示為十六進(jìn)制值或顏色資源负甸。
android:dashGap:尺寸。短劃線的間距痹届,以尺寸值或尺寸資源表示呻待。僅在設(shè)置了 android:dashWidth 時(shí)有效。
android:dashWidth:尺寸队腐。每個(gè)短劃線的大小蚕捉,以尺寸值或尺寸資源表示。僅在設(shè)置了 android:dashGap 時(shí)有效柴淘。
-->
<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer" />
</shape>
簡(jiǎn)單效果圖
xml實(shí)現(xiàn)文件:
<?xml version="1.0" encoding="utf-8"?><!-- -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:radius="15dp"
android:topLeftRadius="3dp" />
<gradient
android:centerColor="#00ff00"
android:centerX="0.5"
android:centerY="0.5"
android:endColor="#0000ff"
android:gradientRadius="25dp"
android:startColor="#ff0000"
android:type="radial" />
<!-- <solid
android:color="#00ff00"/>-->
<size
android:width="10dp"
android:height="10dp" />
<padding
android:bottom="15dp"
android:left="15dp"
android:right="15dp"
android:top="15dp" />
</shape>
在xml文件實(shí)現(xiàn)shape和用java代碼實(shí)現(xiàn)大同小異迫淹,他們命名規(guī)則都是相對(duì)應(yīng)的,可參照官方API文檔悠就,戳此鏈接查看千绪。
圖層列表layer-list
LayerDrawable 是管理其他可繪制對(duì)象陣列的可繪制對(duì)象。列表中的每個(gè)可繪制對(duì)象按照列表的順序繪制梗脾,列表中的最后一個(gè)可繪制對(duì)象繪于頂部荸型。每個(gè)可繪制對(duì)象由單一 <layer-list> 元素內(nèi)的 <item> 元素表示。我們需要注意的是layer-list中有item的先后順序會(huì)影響展示效果,不同順序的效果可能大相徑庭瑞妇,因?yàn)楦寰玻竺娴膇tem總是在之前的item之上并覆蓋顯示。
<?xml version="1.0" encoding="utf-8"?>
<!--
必備辕狰。這必須是根元素改备。包含一個(gè)或多個(gè) <item> 元素。
xmlns:android:字符串蔓倍。必備悬钳。定義 XML 命名空間,其必須是 "http://schemas.android.com/apk/res/android"偶翅。
-->
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<!--
定義要放在圖層可繪制對(duì)象中由其屬性定義的位置的可繪制對(duì)象默勾。必須是 <selector> 元素的子項(xiàng)。接受子 <bitmap> 元素聚谁。
android:drawable:可繪制對(duì)象資源母剥。必備。引用可繪制對(duì)象資源形导。
android:id:資源 ID环疼。此可繪制對(duì)象的唯一資源 ID。要為此項(xiàng)新建資源 ID朵耕,請(qǐng)使用以下形式:"@+id/name"炫隶。加號(hào)表示應(yīng)創(chuàng)建為新 ID⊙植埽可以使用此 ID 檢索和修改具有 View.findViewById() 或 Activity.findViewById() 的可繪制對(duì)象等限。
android:top:整型。頂部偏移(像素)芬膝。
android:right:整型望门。右邊偏移(像素)。
android:bottom:整型锰霜。底部偏移(像素)筹误。
android:left:整型。左邊偏移(像素)癣缅。
-->
<item
android:drawable="@[package:]drawable/drawable_resource"
android:id="@[+][package:]id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension" />
</layer-list>
默認(rèn)情況下厨剪,所有可繪制項(xiàng)都會(huì)縮放以適應(yīng)包含視圖的大小。因此友存,將圖像放在圖層列表中的不同位置可能會(huì)增大視圖的大小祷膳,并且有些圖像會(huì)相應(yīng)地縮放。為避免縮放列表中的項(xiàng)目屡立,請(qǐng)?jiān)?<item> 元素內(nèi)使用 <bitmap> 元素指定可繪制對(duì)象直晨,并且對(duì)某些不縮放的項(xiàng)目(例如 "center")定義重力。例如,以下 <item> 定義縮放以適應(yīng)其容器視圖的項(xiàng)目:
<item android:drawable="@drawable/image" />
為避免縮放勇皇,以下示例使用重力居中的 <bitmap> 元素:
<item>
<bitmap android:src="@drawable/image"
android:gravity="center" />
</item>
layer-list的強(qiáng)大之處在于罩句,它的每一個(gè)item都可以是一個(gè)shape.例如,開(kāi)始我們的控件有一個(gè)需求將控件顯示有一個(gè)1px邊框的矩形敛摘,如下圖
那么我們一個(gè)可以通過(guò)一個(gè)shape就可以實(shí)現(xiàn)门烂,如下
<?xml version="1.0" encoding="utf-8"?><!-- -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white" />
<stroke
android:width="1px"
android:color="#9b9b9b" />
<padding
android:bottom="5dp"
android:left="8dp"
android:right="8dp"
android:top="5dp" />
</shape>
那么如果我們新的需求變更了,左右上邊框不展示了兄淫,即只展示下面的一條線屯远,那么怎么實(shí)現(xiàn)呢,可能大家最常用的就是用一個(gè)1px高度的view加個(gè)背景色填充捕虽,但是如果我們想顯示左邊和邊的邊框呢氓润?那么需要再加View,布局可能會(huì)很復(fù)雜薯鳍。可能你也會(huì)說(shuō)挨措,shape可以指定android:shape="line"來(lái)繪制一條線挖滤,那么咱來(lái)試試。
這就是實(shí)現(xiàn)的效果圖浅役,發(fā)現(xiàn)斩松,線是在中間,這肯定不是我們想要的效果觉既,我們想要的效果是線在控件的最下方惧盹,其實(shí)此時(shí)shape已經(jīng)不能滿足我們的需求了,但是layer-list可以實(shí)現(xiàn)瞪讼,想有哪個(gè)邊框都可以钧椰。如下實(shí)現(xiàn)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#9b9b9b" />
</shape>
</item>
<item android:bottom="1px">
<shape>
<solid android:color="@color/white" />
<padding
android:bottom="5dp"
android:left="8dp"
android:right="8dp"
android:top="5dp" />
</shape>
</item>
</layer-list>
效果圖:
那么如果我們想在控件左邊和下面顯示邊框線,那么在上述lsyer-list中第二個(gè)item加一句 android:left="1px"就可以實(shí)現(xiàn)了符欠。如下圖
是不是比用view填充方便呢嫡霞,關(guān)于java代碼實(shí)現(xiàn)可以直接去參考官方文檔,詳情戳此鏈接希柿。今天就介紹到這诊沪,有問(wèn)題歡迎指出,Have a wonderful day.