Drawable有很多种,它们都表示一种图像的概念,但是它们又不全是图片,通过颜色也可以构造出各式各样的图像的效果。在实际开发中,Drawable常被用来作为View的背景使用。Drawable一般都是通过XML来定义的,当然我们也可以通过代码来创建具体的Drawable对象,只是用代码创建会稍显复杂。在Android的设计中,Drawable是一个抽象类,它是所有Drawable对象的基类,每个具体的Drawable都是它的子类。本文将对Drawable的子类进行一一讲解,减少您的开发时间。

BitmapDarawable

使用BitmapDarawable实现效果

介绍

一个可绘制的位图,可以平铺,拉伸或对齐。 您可以从文件路径,输入流,XML填充或位图对象创建一个BitmapDrawable。它可以使用元素在XML文件中定义。该类处理原始位图图形的管理和转换,并应在绘制到“画布”时使用,bitmapdrawable 语法相对简单

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"android:antialias=android:src="@[package:]drawable/drawable_resource"["true" | "false"]android:dither=["true" | "false"]android:filter=["true" | "false"]android:gravity=["top" | "bottom"|"left"|"right" | "center_vertical" | "fill_vertical"|"center_horizontal" | "fill_horizontal" |"center" | "fill" | "clip_vertical" | "clip_horizontal"]         android:mipMap=["true" | "false"] android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />

android:src

  • 添加图片资源id

android:antialias (是否开启图片抗锯齿功能)

启用或禁用抗锯齿。 旋转时,可以使用抗锯齿来平滑位图的边缘。 默认值是false。
可能是一个布尔值,如“true”或“false”。
开启后会让图片变得光滑,但是可以忽略的降低图片的清晰度。

android:dither (是否开启防抖动效果)

当图片的像素配置和手机屏幕的像素配置不一致时,开启这个可以让高质量的图片在低质量的屏幕上还有较好的显示效果。(默认是开启的,建议开启)

android:filter (是否开启过滤效果)

android:tileMode

平铺模式。这个选项有如下几个值:[“disabled”|“clamp”|“repeat”|“mirror”],其中disable表示关闭平铺模式,这也是默认值,当开启平铺模式后,gravity属性会被忽略。
刚我们看见的为mirror属性,下图分别为 clamp,repeat 两个个属性。


ShapeDrawable

用ShapeDrawable实现效果图

介绍

ShapeDrawable是一种很常见的Drawable,可以理解为通过颜色来构造的图形,它既可以是纯色的图形,也可以是具有渐变效果的图形。ShapeDrawable的语法相对于bitmapdrawable 较为复杂。

 <?xml version="1.0" encoding="utf-8"?><shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape=["rectangle" | "oval" | "line" | "ring"] ><cornersandroid:radius="integer"android:topLeftRadius="integer"android:topRightRadius="integer"android:bottomLeftRadius="integer"android:bottomRightRadius="integer" /><gradientandroid: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"] /><paddingandroid:left="integer"android:top="integer"android:right="integer"android:bottom="integer" /><sizeandroid:width="integer"android:height="integer" /><solidandroid:color="color" /><strokeandroid:width="integer"android:color="color"android:dashWidth="integer"android:dashGap="integer" /></shape>

android:shape 对应属性内容如下:

rectangle oval line ring
矩形 椭圆 横线 圆环

corners 标签

  • android:radius——为四个角同时设定相同的角度,优先级较低,会被其他四个属性覆盖;
  • android:topLeftRadius-: 设定最上角的角度 integer
  • android:topRightRadius—: 设定右上角的角度 integer
  • android:bottomLeftRadius—: 设定最下角的角度 integer
  • android:bottomRightRadius—: 设定右下角的角度 integer

gradient标签

它与标签是互相排斥的,其中solid表示纯色填充,而gradient则表示渐变效果,gradient有如下几个属性:

  • android:angle——渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90 表示从下到上,具体的效果需要自行体验,总之角度会影响渐变的方向
  • android:centerX——渐变的中心点的横坐标
  • android:centerY——渐变的中心点的纵坐标,渐变的中心点会影响渐变的具体效果
  • android:startColor——渐变的起始色
  • android:centerColor——渐变的中间色
  • android:endColo——渐变的结束色
  • android:gradientRadius——渐变半径,仅当**android:type= “radial”**时有效;
  • android:type——渐变的类别,有linear(线性渐变)、radial(径向渐变)

stroke

stroke(边缘,有描边之意)

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

上图中实现代码如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><cornersandroid:radius="2dp"/><gradientandroid:angle="90"android:centerColor="@color/colorPrimaryDark"android:centerX="0"android:centerY="0"android:endColor="@color/colorAccent"android:startColor="@color/colorPrimary"android:type="linear" /><!--<padding--><!--android:bottom="integer"--><!--android:left="integer"--><!--android:right="integer"--><!--android:top="integer" />--><!--纯色填充,与渐变冲突--><!--<solid android:color="color" />--><strokeandroid:width="5dp"android:color="@color/colorBlue"android:dashGap="10dp"android:dashWidth="20dp" />
</shape>

LayerDrawable

用LayerDrawable实现效果图

Layer(层次,层叠,图层)
LayerDrawable对应的XML标签是,它表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果。它的语法如下所示。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid: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

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

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item><bitmap android:src="@drawable/queen"android:gravity="left" /></item><item android:top="30dp" android:left="30dp"><bitmap android:src="@drawable/queen"android:gravity="left" /></item><item android:top="60dp" android:left="60dp"><bitmap android:src="@drawable/queen"android:gravity="left" /></item>
</layer-list>

StateListDrawable

StateListDrawable对应于标签,它也是表示Drawable集合,每个Drawable都对应着View的一种状态,这样系统就会根据View的状态来选择合适的Drawable。StateListDrawable主要用于设置可单击的View的背景,设置button背景颜色等,它的语法如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"android:constantSize=["true" | "false"]android:dither=["true" | "false"]android:variablePadding=["true" | "false"] ><item android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true" | "false"]android:state_focused=["true" | "false"]android:state_hovered=["true" | "false"]android:state_selected=["true" | "false"]android:state_checkable=["true" | "false"]android:state_checked=["true" | "false"]android:state_enabled=["true" | "false"]android:state_activated=["true" | "false"]android:state_window_focused=["true" | "false"] />
</selector>

其中item,可对应多个state标签,系统会根据当前view的状态,自动选择对应的item。

LevelListDrawable

LevelListDrawable对应于标签,它同样表示一个Drawable集合,集合中的每个Drawable都有一个等级(level)的概念。根据不同的等级,LevelListDrawable会切换为对应的Drawable,它的语法如下所示。

<?xml version="1.0" encoding="utf-8"?>
<level-list          xmlns:android="http://schemas.android.com/apk/res/android" >       <item android:drawable="@drawable/drawable_resource"  android:maxLevel="integer"              android:minLevel="integer" />
</level-list>

上面的语法中,每个item表示一个Drawable,并且有对应的等级范围,由android:min- Level和android:maxLevel来指定,在最小值和最大值之间的等级会对应此item中的Drawable。如果它被用来作为ImageView的前景Drawable,那么还可以通过ImageView的setImageLevel方法来切换Drawable。最后,Drawable的等级是有范围的,即0~10000,最小等级是0,这也是默认值,最大等级是10000。对应Imageview代码如下:

ImageView imageView = new ImageView(this);
imageView.setImageLevel(2000);

TransitionDrawable


上图从一张波点图片转到帆船照片的效果

TransitionDrawable对应于标签,它用于实现两个Drawable之间的淡入淡出效果,它的语法如下所示:

<?xml version="1.0" encoding="utf-8"?>     <transition xmlns:android="http://schemas.android.com/apk/res/android" ><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" />    </transition

上述效果实现代码如下:
首先先定义TransitionDrawable,为布局设置background。

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

java代码如下

     TransitionDrawable background = (TransitionDrawable)linearLayout.getBackground();background.startTransition(1000);

最后:drawable 子类还有 ClipDrawable,InsetDrawable 等,这些我们不怎么常用,或者可通过上述drawable也可实现该效果,所以不一一介绍,另外我们可以自定义drawable。只需要继承Drawable类,复写 draw、setAlpha、setColorFilter和getOpacity几个方法即可。其中较为重要的为draw方法。

Drawable的详细使用分析相关推荐

  1. JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用

    http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/index.html 一.系统架构 本文以一个实际的产品为例,来说明 JPEG 在其中的应用. ...

  2. u-boot.lds详细的分析

    对u-boot.lds的更详细的分析 Linker Script Format Linker scripts are text files. You write a linker script as ...

  3. mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析

    MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID        aNum 1           a20050111 2 ...

  4. WaterfallTree(瀑布树) 详细技术分析系列

    前言 WaterfallTree(瀑布树) 是最强纯C#开源NoSQL和虚拟文件系统-STSdb专有的(版权所有/专利)算法/存储结构. 参考 关于STSdb,我之前写过几篇文章,譬如: STSdb, ...

  5. 盘式过滤器详细介绍分析

    盘式过滤器详细介绍分析: 一.盘式过滤器工作原理介绍: 盘式过滤器又称为叠片过滤器或叠片式过滤器,他是由过滤单元并列组合而成,其过滤单元主要是由一组带沟槽或棱的环状增强塑料滤盘构成,上下两层盘片中间沟 ...

  6. Android 短信数据库详细总结分析

    Android 短信数据库详细总结分析 短信 sms  文件 /data/data/com.android.providers.telephony/databases/mmssms.db  这个数据库 ...

  7. linux网络存储服务器选题意义,linux网络存储服务器iscsi详细介绍分析.doc

    linux网络存储服务器iscsi详细介绍分析 一,概述 SCSI最初是一种专门为小型计算机系统设计的I/O技术,但由于其架构和协议自身的优点,后被广泛应用于实现DAS以及SAN的底层技术. SCSI ...

  8. 定向士官计算机网络技术在部队干什么,定向士官、直招士官、义务兵入伍详细对比分析!一文看懂区别!...

    原标题:定向士官.直招士官.义务兵入伍详细对比分析!一文看懂区别! 近日,新浪山东教育频道从山东信息职业技术学院招办了解到,山东信息职业技术学院2019年定向培养士官招生专业.计划和范围权威发布. 2 ...

  9. JAVA使用HttpClient模拟登录正方教务系统,爬取学籍信息和课程表成绩等,超详细登录分析和代码注解

    目录 前言 分析 代码实现 第一次GET POST登录 第二次Get 第三次GET 第四次GET 第五次GET 测试 完整代码 前言 最近在做一个APP,需要获取我们学校--武汉纺织大学皇家停水断电断 ...

最新文章

  1. 大数据文件的批量写入方式
  2. 算法提高课-图论-负环-AcWing 1165. 单词环:spfa判正环、二分、01分数规划
  3. 菜鸟级springmvc+spring+mybatis整合开发用户登录功能(下)
  4. C++判断一个数是否为armstrong number阿姆斯特朗数(附完整源码)
  5. ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记
  6. 资源下载!5本从Python入手机器学习的必备电子书!(附下载链接)
  7. python爬虫分布式怎么构造_如何构建一个分布式爬虫:实战篇
  8. python入门基础知识实例-Python入门教程丨1300多行代码,让你轻松掌握基础知识点...
  9. eclipse导入github项目(踩多个坑后发现这个最实用)
  10. html自定义表格插件,简单实用的jQuery响应式表格插件
  11. Spring Cloud Eureka详解
  12. InfoPath 教程
  13. uniapp苹果无法上架_uniapp无法上架IOS包怎么办
  14. C++核心准则T.61:不要过度参数化成员(SCARY)
  15. 手把手教学弟用js写的打砖块游戏,学弟乐哉~ 附(思路注释+源码)
  16. 即时通讯html页面模板,网页html即时通讯的快速实现方法 - 快商通
  17. 加了索引,mysql查询就一定会用吗?
  18. 红点奖设计概念奖设计之星奖
  19. 【游戏推荐】癞子斗地主--OGEngine精品游戏推荐系列【一】
  20. 2019年牛客多校第一场B题 Integration 定积分 裂项相消

热门文章

  1. php 油耗,小熊油耗官方网站_油耗计算器_车主众测_实际油耗数据和统计报告_提供用车养车售车在线服务...
  2. 【mysql】表名或字段名与关键字重名解决方法
  3. oracle psu补丁sql脚本,打上12.1.2的最新PSU补丁集(20180417),打完后发现没跑脚本,如何补救?...
  4. linux flush 文件,Linux 写文件时 何时 flush buffer
  5. 涉及准考证相关需要关注的一系列问题,涉及防疫、考点信息、计算器等内容
  6. hive java udf_hive java编写udf函数
  7. wpf 控件复制 克隆
  8. 空气质量监控难?飞凌基于i.MX6UL、AM335x设计扬尘在线监测仪显身手
  9. Supervisor:优秀的进程管理工具
  10. Python supervisor 强大的进程管理工具