Drawable详解

不怕跌倒,所以飞翔

关于Drawable的一些说明类的文字我就不写了,但是Drawable其实挺重要的,一些问题都关联着Drawable.

1.Drawable分类

  • BitmapDrawable
  • NicePatchDrawable

1.1BitmapDrawable详解

这几乎是最简单都得Drawable了,他表示的就是一张图片.在实际开发中,我们可以直接引用原始的图片,可可以通过XNML的方式来描述它,通过XML来描述的BitmapDrawable可以设置更多的效果,如下所示(这里先说一下可以设置的属性):

  • android:src 图片的资源id;
  • android:antialias 是否开启图片抗锯齿功能.开启后会让图片变得平滑,同时也会在一定程度上降低图片的清晰度,但是这个降低的幅度较低以至于可以忽略,因此抗锯齿选项应该开启;
  • android:dither 是否开启抖动效果.当图片的像素配置和手机屏幕的像素配置不一致时,开启这个选项可以让高质量的图片在低质量的屏幕上还能保持较好的显示效果,比如图片的色彩模式为ARGB8888,但是在设备屏幕所支持的色彩模式为RGB555,这个时候开启抖动选项可以让图片显示不会过于失真.所以抖动效果也应该开启;
  • android:filter 是否开启过滤效果.当图片尺寸被拉伸或者压缩时,开启过滤效果可以保持较好的显示效果,因此这个选项也应该开启.
  • android:gravity 当图片小于容器的尺寸时,设置此选项可以对图片进行定位;
  • android:mipMap 着时一种图像相关的处理技术,也叫纹理映射,比较抽象,这里不对其深入研究,默认值为false,在日常开发中此选项不常用;
  • android:titleMode 平铺模式.有以下几个属性"disable","clamp","repeat","mirror"其中disable表示平铺模式,也是默认值,当开启平铺模式后,gravity属性会被忽略.这里主要说以下:repeat表示的时简单都的水平和竖直方向的平铺效果;mirror表示一种在水平和竖直方向上的镜面投影效果;而clamp表示的效果比较奇特,图片的四周的像素会扩展到周围区域

1.2NinePatchDrawable详解

它代表的是一张.9格式的图片,.9图片可以自动的根据所需要的高/宽进行相应的缩放并保证不失真,和BitmapDrawable一样,在实际使用中直接引用图片即可,里面用到的属性都一样,只是要通过<nine-path>标签进行描述.这里面src设置的图片要是一张.9的图,这个就比较尴尬了,why?为什么我不直接设置背景.

1.3ShapeDrawable详解

很常见的Drawable,可以理解为通过颜色来构造的图形,它既可以是纯色的图形,也可以是具有渐变效果的图形.(这里其实用的是shape标签常见的Drawable,其实体类实际是GradientDrawable),基本上有些简单的背景我们都可以使用这个标签去写

  • android:shape 表示图形的形状,包含以下几个属性值,默认是矩形
    • rectangle 矩形
    • oval 椭圆
    • line 线
    • ring 圆环 针对这个形状,有5个特殊的属性
      • android:innerRadius 圆环的内半径,和android:innerRadiusRatio同时存在时,以android:innerRadius为准
      • android:thickness 圆环的厚度,即外半径减去内半径的大小,和android:thicknessRatio共同存在时,以android:thickness为准
      • android:innerRadiusRatio 内半径占整个Drawable宽度的比例,默认值为9.如果为n,那么内半径=宽度/n
      • android:thicknessRatio 厚度占整个Drawable宽度都的比例,默认值为3.如果为n,那么厚度=宽度/n
      • android:useLevel 一般都应该使用false,否则有可能无法到达预期的显示效果,除非它被当成LevelListDrawable来使用

<corners>标签

  • android:radius 为四个角同时设置角度
  • android:topLeftRadius 设定左上角的角度
  • android:topRightRadius 设定右上角的角度
  • android:bottomLeftRadius 设定左下角的角度
  • android:bottomRightRadius 设定右下角的角度

<gradient>标签
它与<solid>标签时互相排斥的,<solid>表示纯色,而<gradient>表示渐变效果

  • android:angle 渐变的角度,默认为0,其值必须时45的整数倍,0表示从左到右,90表示从下到上,具体的效果需要自行体验,角度会影响渐变的方向.
  • android:centerX 渐变的中心点横坐标
  • android:centerY 渐变的中心点纵坐标
  • android:startColor 渐变的其实色
  • android:centerColor 渐变的中间色
  • android:endColor 渐变的结束色
  • android:gradientRadius 渐变半径,仅当android:type="radial"时有效
  • android:useLevel 一般为false,有以下几个属性
    • linear 线性渐变
    • radial 径向渐变
    • sweep 扫描线渐变

<solid>

  • android:color shape填充的颜色

<stroke>

  • android:width 描边的宽度
  • android:color 描边的颜色
  • android:dashWidth 组成虚线的线段的宽度
  • android:dashGap 组成虚线的线段之间的间隔,间隔越大则虚线看起来空隙就越大

这里面注意一点就是如果android:dashWidth或者android:dashGap有一个为0则虚线不会出现

<padding>

  • android:left/top/right/bottom 内边距

<size>

  • android:width 宽度
  • android:heeight 高度

1.4LayerDrawable详解

LayerDrawable对应的xml标签时<layer-list>,它表示一个层次话的Drawable集合,通过将不同的Drawable(可以时shape或者是其他的类型)放置在不同的层上面从而达到一种叠加后的效果.

一个简单的layer-list中可以包含多个item,每个item表示一个Drawable(代表一层,并且一层一层的叠加).Item的结构也比较简单,比较常见的属性有:android:top/bottom/left/right 它们分别表示Drawable相对于View的上下左右的偏移量,单位时像素.另外我们可以使用android:drawable属性来直接引用一个已有的Drawable资源,也可以在item中自定义Drawable.默认情况下,layer-list中的所有Drawable都会被缩至View的大小,相对于bitmap来说,需要使用android:gravity属性才能控制图片的显示效果.Layer-list有层次的概念,下面的item会覆盖上面的item,通过合理的分层,可以实现一些特殊的叠加效果.

1.4StateListDrawable详解

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

可以使用的一些标签说明

  • android:constantSize 固定大小是否不随着其状体的改变而改变,因为状态的改变会导致StateListDrawable切换到具体的Drawable,而不同的Drawable具有不同的固定大小.true表示StateListDrawable的固有大小保持不变,这时它有固有大小时内部所有Drawable的固定大小的最大值,false则会随着状态都得改变而改变.此选项默认值为false.
  • android:dither 是否开启抖动效果,开启此选项可以让图片在低质量的屏幕上仍然获得较好的显示效果.此选项默认值为true.
  • android:variablePadding padding是否随着其状态的改变而改变,true表示会随着状态的改变而改变,false表示内部所有的Drawable的padding的最大值.默认值为false,不建议开启此选项.

<item>标签表示具体Drawable,他的结构也比较简单,但是里面主要的就是状态的Drawable信息.

  • android:state_pressed 按下状态,按下没有松开时候的状态
  • android:state_focused 获取焦点的状态(电视开发遥控器的问题)
  • android:state_selected 用户选择的View
  • android:state_checked 选中了View,一般适用于CheckBox这类选中和非选中状态之间的切换
  • android:state_enabled 表示View当前处于可用状态

1.5LevelListDrawable详解

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

  • android:maxLevel 最大等级
  • android:minLevel 最小等级

这里面也是每一个Item代表一个Drawable,但是设置等级只有两个等级,最大和最小,可以使用ImageView.setImageLevel方法来切换Drawable.最小值时0,最大值时10000.

1.6TransitionDrawable详解

TransitionDrawable对应<transition>标签,它用于实现两个Drawable的淡入淡出效果(注意Drawable,不是View,别和动画那个混了)

属性的问题都差不多,但是这里要你直接让你使用你还真不一定会.

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bitmap_1"/>
    <item android:drawable="@drawable/bitmap_2"/>
</transition>

然后把这个当成一张图片设置给一个View,然后通过startTransiton(1000)进行开启,使用reverseTransition()关闭这个东西.其实我觉得这个动画效果和你点击换一张图片一样只是有一个时间差,有一个渐变效果.

1.7InsetDrawable详解

InsetDrawable对应于<inset>标签,它可以将其他Drawable内嵌到自己当中,并可以在四周流出一定的距离.当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现,同事我们知道,通过LayerDrawable也可以实现这种效果

  • android:insetTop
  • android:insetBottom
  • android:insetLeft
  • android:insetRight

上面这四个代表内凹的大小

其实这个里面也是可以放一些其他标签的如<shape>,直接在<inset>中添加<shape>标签就可以了,还可以添加<bitmap>等其他标签

1.8ScaleDrawable详解

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

  • android:scaleGravity 等同于shape中的android:gravity
  • android:scaleWidth android:scaleHeight 分别表示指定Drwable宽高的缩放比例,注意这里是以百分比的形式展示,这里注意一个概念,缩放比

ps这里的等级可以使用对象.setLevel()方法进行设置,也可以用过getLevel()方法进行获取,但是当等级为0的时候这张图片是不会显示的因为

1.9ClipDrawable详解

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

ps这个裁剪比例是按照你设置的等级进行裁剪的,打个比方,当你把等级设置成8000的时候,那么裁剪了2000,也就是裁剪了20%


上面只是一个基础的概念,其实关于Drawable基本上就是上面这些基本的类的使用,这里面使用的只是xml形式的,其实很多背景图片我们都能使用上面这些方法进行设置,平时多注意的话,能减少很多和美工的争执....

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,904评论 25 707
  • 1、Drawable 简介 Drawable——可简单理解为可绘制物,表示一些可以绘制在 Canvas 上的对象。...
    牧秦丶阅读 14,754评论 0 15
  • 参考资料 目录 简介 Drawable分类2.1) BitmapDrawable2.2) ShapeDrawabl...
    玄策阅读 757评论 0 0
  • 前言 本文是本人阅读《Android开发艺术探索》的第6章《Android的Drawable》后的总结笔记。包含了...
    daking阅读 5,308评论 2 29
  • 机遇、繁忙大多在以东的城市,辽阔、安逸则在以西的地方,而我恰恰在之中. 去年的今天,我辞掉了工作,加班状态持续到周...
    孟广超阅读 361评论 0 0