Android中的Drawable

优点:使用简单,比自定义View的成本低;非图片类型的Drawable占用空间较小,这对减小apk的大小也有很大的帮助

一、Drawable的简介

在Android的设计中,Drawable是一个抽象类,它是所有Drawable对象的基类,每个具体的Drawable都是它的子类。

Drawable的内部宽高这个参数比较重要,通过getIntrinsicWidth和getIntrinsicHeight这两个方法可以获取到它们。

二、Drawable的分类

2.1 BitmapDrawable

表示一张图片,可通过xml的方式来描述它

android:src——图片的资源id

android:antialias——是否开启图片抗锯齿功能,开启后会让图片变得平滑,同时也会在一定程度上降低图片的清晰度

android:dither——是否开启抖动效果,当图片的像素配置和手机屏幕的像素配置不一致时,开启这个选项可以让高质量的图片在低质量的屏幕上还能保持很好的显示效果

android:filter——是否开启过滤功能,当图片尺寸被拉伸或者压缩时,开启过滤效果可以保持较好的显示效果

android:gravity——但图片小于容器的尺寸时,设置此选项可以对图片进行定位。

android:mipMap——这是一种图像相关的处理技术,也叫纹理映射,比较抽象,默认值为false

android:tileMap——平铺模式,有四种模式:disabled、clamp、repeat和mirror

disabled:关闭平铺模式

repeat:简单的水平和竖直方向上的平铺效果

mirror:表示一种在水平和竖直方向上的镜面投影效果

clamp:表示的效果更佳奇特,图片四周的像素会扩展到周围区域

2.2 ShapeDrawable

通过颜色来构造的图形,既可以是纯色的图形,也可以是具有渐变的图形

android:shape——表示图形的形状,有四个属性值:rectangle(矩形)、oval(椭圆)、line(横线)和ring(圆环)。默认值是矩形,其中line和ring必须通过stroke标签来指定线的宽度和颜色等信息

corners——表示shape的四个角的角度,只适用于矩形shape,这里的角度是指圆形的程度,用px来表示,有如下5个属性:

android:radius——为四个角同时设定相同的角度,优先级较低,会被其他四个属性覆盖

android:topLeftRadius——设定左上角的角度

android:topRightRadius——设定右上角的角度

android:bottomLeftRadius——设定左下角的角度

android:bottomRightRadius——设定右下角的角度

gradient——与solid标签互斥,其中solid表示纯色填充,而gradient则表示渐变效果,gradient又如下几个属性:

android:angle——渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90表示从上到下,其他的效果自行体验

android:centerX——渐变的中心点的横坐标

android:centerY——简便的中心点的纵坐标

android:startColor——渐变的起始色

android:centerColor——渐变的结束色

android:gradientRadius——渐变半径,仅当android:type=“radial”时有效

android:useLevel——一般为false,当Drawable作为StateListDrawable使用时为true

android:tyoe——渐变的类别,有linear(线性渐变)、radial(径向渐变)、sweep(扫描线渐变)三种,其中默认值为线性渐变

solid——表示纯色填充,通过android:color可指定shape中填充的颜色


stroke——shape的描边

android:width——描边的宽度,越大则shape的边缘线会越粗

android:color——描边的颜色

android:dashWidth——组成虚线的线段的宽度

android:dashGap——组成虚线的线段之间的间隔,间隔越大则虚线看起开空隙就越大

padding——这个表示空白,表示的是包含它的view的空白

size——shape的大小

android:width——表示shape的宽

android:height——表示shape的高

2.3 LayerDrawable

LayerDrawable对应的XML标签是<layer-list>,表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同层上面从而达到一种叠加后的效果

一个layer-list中可以包含多个item,每个item表示一个Drawable。

常用属性:android:top、android:bottom、android:left和android:right,分别表示Drawable相对于view的上下左右的偏移量,单位为像素。可通过drawable属性来直接引用一个已有的资源。

2.4 StateListDrawable

StatelistDrawable对应于<selector>标签,它也是表示Drawable集合,每个Drawable都对应着View的一种状态,这样系统就会根据View的状态来选择合适的Drawable。StateListDrawable主要用于设置可单击的View的背景,最常见的是Button。

android:constantSize——StateListDrawable的固有大小是否不随着其状态的改变而改变,因为状态的改变会导致StateListDrawable切换到具体的Drawable,而不同的Drawable具有不同的固有大小。True表示StateListDrawable的固有大小保持不变,这时它的固有大小是内部所有Drwable的固有大小的最大值,false则会随着状态的改变而改变,此项默认值为false。

android:dither——是否开启抖动效果,这个在BitmapDrawable中也有提到,开启此项可以让图片在低质量的屏幕上仍然获得较好的显示效果。此选项默认为true。

android:variablePadding——表示是否随着其状态的改变而改变,true表示会随着状态的改变而改变,false表示其padding是内部所有Drawable的padding的最大值,此选项默认值为false,并且不建议开启此选项。

<item>标签表示一个具体的Drawable,它的结构也比较简单,其中android:drawable是一个已有的Drawable的资源id,剩下的属性表示的是View的各种状态


2.5 LevelListDrawable

对应于<level_list>标签,它同样表示一个Drawable集合,集合中每个Drawable都有一个等级的概念。根据不同的等级,LevelListDrawable会切换为对应的Drawable。

其等级范围为:0~10000

2.6 TransitionDrawable

对应于《transition》标签,用于实现两个Drawable之间的淡入淡出效果

2.7 InsetDrawable

对应于<inset>标签,可以将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距。当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现。

2.6 ScaleDrawable

对应于<scale>标签,可以根据自己的等级将指定的Drawable缩放到一定比例

其中,android:scaleGravity的含义等同于shape中的android:gravity,而android:scaleWidth和android:scaleHeight分别表示对指定Drawable宽和高的缩放比例,以百分比的形式表示。

等级为0表示ScaleDrawable不可见,这是默认值,要想ScaleDrawable可见,则其等级不能为0,看源码:

ScaleDrawable的draw方法
ScaleDrawable的onBoundsChange方法

由于iw一般为0 ,则可见,如果ScaleDrawable的级别为最大值10000,那么就没有缩放的效果;如果ScaleDrawable的级别越大,那么内部的Drawable看起来就越大;如果ScaleDrawable的xml中所定义的缩放比例越大,那么内部的Drawable看起来就越小。

2.9 ClipDrawable

对应于<clip>标签,可以根据自己当前的等级来裁剪另一个Drawable,裁剪方向可以通过android:clipOrientation和android:gravity这两个属性来共同控制

clipOrientation表示裁剪方向,有水平和竖直方向,gravity比较复杂,需要和clipOrientation一起才能发挥作用。

对于ClipDrawable来说,等级0表示完全裁剪,及整个Drawable都不可见,最大等级10000表示不裁剪。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,056评论 25 707
  • 6.1 Drawable 简介 Android 中的 Drawable 表示一种可以在 Canvas 上进行绘制的...
    kongjn阅读 1,560评论 0 1
  • Android中Drawable是一种可以在Canvas上进行绘制抽象的概念,种类很多,常见的颜色和图片都可以是一...
    斜杠时光阅读 1,220评论 0 7
  • 前言 本文是本人阅读《Android开发艺术探索》的第6章《Android的Drawable》后的总结笔记。包含了...
    daking阅读 5,288评论 2 29
  • 朋友静静是一个非常勤奋的人,不管是学生时代,还是参加工作之后,都表现得非常优异,一直以来她都是我的榜样。 但是,前...
    懒der闲阅读 405评论 0 0