Android可繪制對(duì)象資源之shape和layer-list使用

Code4Android.jpg

前言

文章中內(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)單效果圖


這里寫(xiě)圖片描述

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邊框的矩形敛摘,如下圖

這里寫(xiě)圖片描述

那么我們一個(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)試試。

這里寫(xiě)圖片描述

這就是實(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>

效果圖:

這里寫(xiě)圖片描述

那么如果我們想在控件左邊和下面顯示邊框線,那么在上述lsyer-list中第二個(gè)item加一句 android:left="1px"就可以實(shí)現(xiàn)了符欠。如下圖

這里寫(xiě)圖片描述

是不是比用view填充方便呢嫡霞,關(guān)于java代碼實(shí)現(xiàn)可以直接去參考官方文檔,詳情戳此鏈接希柿。今天就介紹到這诊沪,有問(wèn)題歡迎指出,Have a wonderful day.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曾撤,一起剝皮案震驚了整個(gè)濱河市端姚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挤悉,老刑警劉巖渐裸,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡橄仆,警方通過(guò)查閱死者的電腦和手機(jī)剩膘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盆顾,“玉大人怠褐,你說(shuō)我怎么就攤上這事∧埽” “怎么了奈懒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宪巨。 經(jīng)常有香客問(wèn)我磷杏,道長(zhǎng),這世上最難降的妖魔是什么捏卓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任极祸,我火速辦了婚禮,結(jié)果婚禮上怠晴,老公的妹妹穿的比我還像新娘遥金。我一直安慰自己,他們只是感情好蒜田,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布稿械。 她就那樣靜靜地躺著,像睡著了一般冲粤。 火紅的嫁衣襯著肌膚如雪美莫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天梯捕,我揣著相機(jī)與錄音厢呵,去河邊找鬼。 笑死傀顾,一個(gè)胖子當(dāng)著我的面吹牛述吸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锣笨,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蝌矛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了错英?” 一聲冷哼從身側(cè)響起入撒,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椭岩,沒(méi)想到半個(gè)月后茅逮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體璃赡,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年献雅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碉考。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挺身,死狀恐怖侯谁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情章钾,我是刑警寧澤墙贱,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站贱傀,受9級(jí)特大地震影響惨撇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜府寒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一魁衙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧株搔,春花似錦剖淀、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茅撞。三九已至帆卓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間米丘,已是汗流浹背剑令。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拄查,地道東北人吁津。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像堕扶,于是被迫代替她去往敵國(guó)和親碍脏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,135評(píng)論 25 707
  • XML bitmap XML 位圖是在 XML 中定義的資源稍算,指向位圖文件典尾。實(shí)際上是原始位圖文件的別名。XML 可...
    李建彪閱讀 1,726評(píng)論 0 3
  • --1-- 越長(zhǎng)大越覺(jué)得愛(ài)情這種玩意兒仿佛真的是不存在的河闰,就算有,也非常非常少了褥紫。你看大街上手拉著手黏在一起互相叫...
    亦綠閱讀 1,565評(píng)論 2 3
  • 在知乎上看到一篇寫(xiě)自己患病母親卻不重視髓考,最終延誤時(shí)機(jī)導(dǎo)致部分器官切除的文章部念,也看了文章下邊的評(píng)論,全部在責(zé)備這個(gè)母...
    向往者閱讀 283評(píng)論 0 1
  • 1. 今天花了很多時(shí)間回聽(tīng)Frank老師的視頻绳军,翻譯印机;1個(gè)半小時(shí)的課程翻譯居然超過(guò)了5000字還感覺(jué)翻譯的不完...
    拓含閱讀 162評(píng)論 0 0