Drawable简介

Drawable都表示一种图像的概念,但又不全是图片,通过颜色也可以构造出各式各样的图像效果。在实际开发Drawable常被用来作为View的背景使用。Drawable一般通过XML来定义,我们也可以通过代码来创建具体的Drawable对象。在Android设计中,Drawable是一个抽象类,它是所有Drawable的基类。Drawable的内部宽高这个参数很重要,可以通过getIntrinsicWidth和getIntrinsicHeight获取。但不是所有Drawable都有内部宽高,比如一个颜色形成的Drawable就没有宽高的概念。要注意它的内部宽高不等同于它的大小,一般来说Drawable是没有大小概念的,当用作View的背景时,Drawable会被拉伸至View的同等大小。

Drawable的分类

1.BitmapDrawable

它表示的就是一张图片,我们可以直接引用原始的图片,也可以通过XML的方式来描述它

BitmapDrawable属性

src:图片的资源id
antialias:是否开启图片抗锯齿功能,开启后会让图片变得平滑,同时也会在一定程度上降低图片的清晰度,但是这个降低的幅度较低可以忽略

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

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

gravity:当图片小于容器的尺寸时,设置此选项可以对图片进行定位,多个选项可用|来组合使用

mipMap:一种图像相关处理技术,也叫纹理映射,默认为false
tileMode:平铺模式。一共有四个值 disabled clamp repeat mirror,disable表示关闭平铺模式,这也是默认值,当开启平铺模式后,gravity属性会被忽略。后三个表示的都是平铺模式,repeat表示的是简单的水平和竖直方向上的平铺效果,mirror表示一种在水平和竖直方向上的镜面投影效果,而clamp表示图四周的像素会扩展到周围区域

NinePatchDrawable也表示一张图片

2.ShapeDrawable

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

< shape>标签创建的Drawable其实体类实际上是GradientDrawable。

shape:表示图形的形状,有四个选项 rectangle oval line ring。它的默认值是矩形,另外line和ring这两个选项必须要通过< stroke>标签来指定线的宽度和颜色等信息,否则无法达到预期效果。针对ring这个形状有五个特殊的属性

< corner>:表示shape的四个角的角度。它只适用于矩形shape,这里的角度指圆角的程度,用px来表示,有五个属性
radius:为四个角设定相同的角度,优先级较低,会被其他四个属性覆盖

topLeftRadius:设定左上角的角度

topRightRadius:设定右上角的角度

bottomLeftRadius:设定左下角的角度

bottomRightRadius:设定右下角的角度

< gradient>
它和< soild>标签是相互排斥的,其中soild表示纯色填充,gradient表示渐变效果

angle:渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90表示从下到上,角度会影响渐变的方向
centerX:渐变的中心点的横坐标

centerY:渐变的中心点的纵坐标,渐变的中心点会影响渐变的具体效果

startColor:渐变的起始色

centerColor:渐变的中间色

endColor:渐变的结束色

gradientRadius:渐变半径,仅当type为radial时有效

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

type:渐变的类别 linear radial sweep

< soild>:表示纯色填充 使用color指定填充颜色

< stroke>:shape的描边

width:描边的宽度,越大则shape的边缘线就会看起来越粗

color:描边的颜色

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

dashGap:组成虚线的线段之间的间隔,越大则虚线看起来空隙越大

若dashWidth或者dashGap有一个为0虚线效果都不能生效

< padding>表示包含它的View的空白,四个属性left right top bottom

< size>:shape的大小,有两个属性width height。表示的是shape的固有大小,但一般来说并不是shape最终显示的大小,对于shape来说并没有宽高的概念,作为View的背景它会自适应View的宽高,此时getIntrinsicWidth,getIntrinsicHeight会返回-1,但是通过该标签来指定宽高信息,这个时候就有了所谓的宽高。所以size用来指定固有宽高,但作为View背景时还是会被拉伸

3.LayerDrawable

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

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

item常用属性
top bottom left right,表示Drawable相对于View的上下左右的偏移量,单位为像素。

我们还可以通过drawable属性来直接引用一个已有的Drawable资源,也可以在item中自定义Drawable。默认情况下在list中的Drawable都会被缩放至View的大小,对于bitmap来说,需要使用gravity属性才能控制图片的显示效果layer-list有层次的概念,下面的item会覆盖上面的item,通过合理的分层可以实现一些特殊的叠加效果

4.StateListDrawable

对应于< selector>标签也表示Drawable集合,每个Drawable都对应着View的一种状态,这样系统就会根据View的状态来选择合适的Drawable。它主要用于设置可单击的View的背景,最常见的是Button。
它有以下属性
constantSize:StateListDrawable的固有大小是否不随着其状态的改变而改变。因为状态的改变会导致它切换到具体的Drawable,而不同的Drawable具有不同的固有大小。true表示StateListDrawable的固有大小保持不变,这时它的固有大小是内部所有Drawable的固有大小的最大值,false则随着状态的改变而改变

dither:是否开启抖动效果

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

实例

未点击时

点击时

5.LevelListDrawable

对应< level-list>标签,表示一个Drawable集合,集合中的每个Drawable都有一个等级概念,根据不同等级它会切换为对应的Drawable。在最小值和最大值之间的等级会对应此item中的Drawable。在最小值和最大值之间的等级会对应此item中的Drawable。当它作为View的背景时,可以通过Drawable的setLevel方法来设置不同的等级从而切换具体的Drawable。如果被用来作为ImageView的前景Drawable,那么还可以通过ImageView的setImageLevel方法来切换Drawable。等级的范围时0-10000,最小等级0是默认值。

6.TransitionDrawable

对应于< transition>标签,用于实现两个Drawble之间的淡入淡出效果,属性为基本的上下左右

实例

显示效果为text背景两个颜色之间的渐变。

7.InsertDrawable

对应于< insert>标签,它可以将其他Drawable内嵌到自己当中,并在四周留出一定的间距。当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsertDrawable来实现,通过LayerDrawable也可以实现这种效果
属性

insertTop/insertRight/insertLeft/insertBottom:表示上右左下内凹的大小

实例

效果

8.ScaeDrawable

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

scaleGravity:等同于shape中的gravity
scaleWidth/Height:表示对指定Drawable宽高的缩放比例,以百分比形式表示

等级对ScaleDrawable的影响
0:不可见

由上面的缩放代码可以看出当等于MAX_LEVEL时,没有缩放效果。如果ScaleDrawable的级别越大,那么内部的Drawable看起来越大,若XML中定义的缩放比例越大,内部Drawable看起来越小。

少了设置等级这一步是无法正常显示的,因为等级默认为0,不可见,系统内部约定的等级范围为0-10000

9.ClipDrawable

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

在ClipDrawable中,等级范围0-10000,0表示完全裁剪,10000表示不裁剪

自定义Drawable

Drawable的使用范围要么是作为ImageView中的图像来显示,要么是作为View的背景,大多数以View的背景出现,我们可以通过重写Drawable的draw方法来自定义Drawable通常我们没必要自定义Drawable,因为自定义的Drawable无法在XML中使用。
制作一个圆形Drawable

这四个方法都需要重写

当自定义Drawable有固有大小时最好重写getIntrinsicWdth/Height,因为它们会影响到View的wrap_content布局。比如自定义Drawable是绘制一张图片,那么它的内部大小就可以选用图片的大小。而上面的则是由颜色填充的圆形没有固定大小,此时它的内部大小为-1。注意内部大小不等于Drawable的实际区域大小,Drawable实际区域大小可以通过它的getBounds方法来得到,一般和View尺寸相同

【学习】Android的Drawable相关推荐

  1. 第一天学习Android的一些笔记

    2019独角兽企业重金招聘Python工程师标准>>> 昨天学习了怎样装Android配置环境,下载SDK用了好久的时间,再加上一开始不会,弄了好长时间,今天第一天学习,跟着视频教程 ...

  2. 动画学习android,Android动画学习

    个人觉得学习Android动画最好的方式就是看开发者文档,所以我就当做翻译,将文章翻译一次吧 Animation Resources 动画资源可以用来定义两种类型的动画 创建一种将图片上进行一系列变化 ...

  3. 学习Android开发只要这些东西,Android篇

    前阵子,我和阿里的薪酬福利专家M同学聊了一下午,M同学做了9年薪酬,和我们吐槽了很多薪酬方面的现象,也道出了少有人关注的薪酬逻辑和常识. 这一次,我又找了一位阿里技术岗位的招聘专家T同学,从他的视角中 ...

  4. 手电筒软件测试初学者,新手学习android做得一个闪光灯手电筒(测试过很多机型都可以)...

    看到很多刚学习的同志都很纠结按照网上很多代码的实现方法都打开不了闪光灯,确实刚开始也有同感滴啦!希望能给你们一些思路! 废话不多说先上几张图片(有图有真像哦!!!!!!!) 思路:开启闪光灯的方法 我 ...

  5. [0 to 0.5]从零开始学习Android动画知识(下)

    [0 to 0.5]从零开始学习Android动画知识(下) 矢量动画(Scalable Vector Graphics) 不同于前面的为控件做动画效果的方法,矢量动画则是为图形做出动画效果 矢量图 ...

  6. android 图片 drawable,在android中Drawable图片使用教程

    在android项目的目录里面,res存放着各种资源,其中Drawable是android开发中使用最广泛的资源,它既可以直接用图片作为资源,也可以用xml文件.本文学习啦小编主要介绍在android ...

  7. 玩转Android之Drawable的使用

    Drawable天天用,可你是否对Drawable家族有一个完整的认知?今天我们就来系统的学习一下Drawable的使用. 1.概述 用过Drawable的筒子都知道Drawable有很多种,有的时候 ...

  8. 中国移动开发者社区专访:学习Android的两大法宝

    本文为原创,如需转载,请注明作者和出处,谢谢! 近日,接受了中国移动开发者社区的专访,谈了关于Android的一系列问题 http://dev.10086.cn/upload/developers_m ...

  9. Android 自带图标库 android.R.drawable

    在xml文件中调用. android:title="@string/secure_connect" android:orderInCategory="100" ...

  10. 开始认真学习Android了

    从11年开始,就开始在以前那台破笔记本上装上了Android,并且买了一本当初去面试的时在等别人批改笔试题时候,翻看的Android入门书籍:但是由于那台笔记本实在性能太差,一打开eclipse就发热 ...

最新文章

  1. c+和python的区别-c语言和python之间有什么区别
  2. [Win10]鼠标没用,插入USB口电脑提示USB Optical Mouse找不到驱动程序的解决方案
  3. SENet(Squeeze-and-Excitation Networks)
  4. mogodbshell中数组对象查询修改方法
  5. aspose word 获取标题_Word干货|多级标题的自动编号怎么添加?
  6. 第十三期:消灭 Java 代码的“坏味道”
  7. 【2014-11-23】《The Hardware/Software Interface》– Section 11
  8. php与sql server,PHP和SQL Server – 思考
  9. lightclients将于4月27日主持召开EIP-3074社区会议
  10. 一起谈.NET技术,ASP.NET MVC 通过 FileResult 向浏览器发送文件
  11. SQL case when then end根据某列数据内容在新列显示自定义内容
  12. android p官方铃声,Android 铃声播放
  13. 揭秘:原来腾讯、网易、阿里竟是这样招人的……
  14. liteIDE创建go工程,创建包工程
  15. 那些你不愿说给领导的话
  16. iPhone又爆Wi-Fi漏洞 中招Wi-Fi就废了
  17. B.FRIENDit:键盘轴体零死角剖析,挑选机械式键盘不必烦恼!
  18. Emag eht htiw Em Pleh【模拟】
  19. win10系统无法连接网络解决办法
  20. linux绑定ip mac地址,人文网-Linux系统绑定IP和MAC地址

热门文章

  1. 谈谈Android热修复
  2. 【狂神说Java】Vue学习笔记03-----基础语法指令
  3. 03- 目标检测数据集和标注工具介绍 (目标检测)
  4. 淡黄色贝塔环糊精改性金属离子聚合物β-CD-PVDF/-PBS/β-CD-NaOH
  5. 编译原理语法分析器实验报告
  6. 超级计算机 更深的蓝 是什么,计算机“更深的蓝”具有智能吗
  7. 酒店vr全景展示拍摄提供更多合作和洽谈的机会
  8. gor 测试环境搭建
  9. 【车间调度】基于灰狼优化算法求解柔性作业车间问题matlab源码
  10. A、B、AB和D类功放对比