Drawable表示一种可以在canvas上进行绘制的抽象概念。
Drawable优点:1.使用简单,比自定义view成本低。
2.非图片类的Drawable占用体积小,这对减少apk有很大作用。
Drawable分类:Drawable的种类繁多,本章介绍如下分类,BitmapDrawable、NinePatchDrawable、ShapeDrawable、LayerDrawable、StatelistDrawable、LevelListDrawable、TransitionDrawable、InsetDrawable、ScaleDrawable、ClipDrawable。
1.BitmapDrawable:表示一张图片。
示例:
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://shechmas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource" //图片资源
android:antialias=["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:titleMode=["disable"|"clamp"|"repeat"|"mirror"]
//平铺模式,当开启平铺模式时gravity不起作用
//disable 关闭平铺模式
//clamp 图片像素会扩展到周围
//repeat 水平和竖直向上的平铺效果
//mirror 水平和竖直向上的镜面效果
2.NinePatchDrawable:表示一张图片,但是也可以用.9图,属性和BitmapDrawable一致。
3.ShapeDrawable:用颜色来构建的图形。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
//shape表示图形的形状 rectangle矩形 oval椭圆 line横线 ring圆环 后面两个需要和<stroke>配合使用
<corners android:radius="1dp"
android:bottomLeftRadius="1dp"
android:bottomRightRadius="1dp"
android:topLeftRadius="1dp"
android:topRightRadius="1dp"/>
//表示四个角的角度 只适用于矩形shape
<gradient android:angle="1dp" //渐变角度
android:centerX="1dp" //渐变中心点横坐标
android:centerY="1p" //渐变中心点纵坐标
android:startColor="@color/colorAccent" //渐变起始色
android:centerColor="@color/colorAccent" //渐变中间色
android:endColor="@color/colorAccent" //渐变结束色
android:type="linear" //渐变类型 linear线性渐变 radial径向渐变 sweep扫描线渐变
android:gradientRadius="1dp" //渐变半径 仅当为径向渐变时起作用
android:useLevel="true"/> //一般为false,当与StateListDrawable一起使用为true
//表示渐变效果
<padding android:right="1dp"
android:left="1dp"
android:top="1dp"
android:bottom="1dp"/>
//表示空白,表示的是包含它的view的空白,不是shape的空白
<size
android:width="1dp" //修改的是getIntrinsicWidth的值
android:height="1dp"/> //修改的是getIntrinsicHeight的值
//表示宽高 但是当shape作为view的背景时,还是会被拉伸或者缩小到view的大小
<solid android:color="@color/colorAccent"/>
//表示填充色
<stroke android:width="1dp" //描边宽度
android:color="@color/colorAccent" //描边颜色
android:dashGap="1dp" //组成虚线的线段的宽度
android:dashWidth="1dp"/> //组成虚线的线段的空隙
//表示描边 注意:dashGap和dashWidth都要有值才能起作用
</shape>
4.LayerDrawable:表示一种层次化的Drawable的集合。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_launcher_background"
android:top="1dp"
android:bottom="1dp"
android:left="1dp"
android:right="1dp"/>
</layer-list>
//top bottom left right 表示相对view的偏移量 drawable表示图片资源,也可以在item内自定义Drawable
以下是一个输入框的示例:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item >
<shape android:shape="rectangle">
<solid android:color="#0ac39e"/>
</shape>
</item>
<item android:bottom="6dp">
<shape android:shape="rectangle">
<solid android:color="@android:color/white"/>
</shape>
</item>
<item android:right="1dp"
android:left="1dp"
android:bottom="1dp">
<shape android:shape="rectangle">
<solid android:color="@android:color/white"/>
</shape>
</item>
</layer-list>
5.StateListDrawable:表示Drawable的集合,对应的是<selector>标签。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="true" //StateListDrawable的固有大小是否随其状态改变而改变
android:dither="true" //是否开启抖动
android:variablePadding="true"> //表示StateListDrawable的padding是否随状态改变
<item android:drawable="@drawable/ic_launcher_background"
android:state_pressed="true" //表示按下状态,比如Botton被按下后没有松开的状态
android:state_focused="true" //表示view已经获取到焦点
android:state_hovered="true"
android:state_selected="true" //表示用户选择了view
android:state_checkable="true" //表示用户选中了view,一般适用于checkBox这类
android:state_checked="true"
android:state_enabled="true" //表示view处于可用状态
android:state_activated="true"
android:state_window_focused="true"/>
</selector>
6.LevelListDrawable:表示一个Drawable的集合,集合中每个Drawable都有一个等级(level)的概念,对应标签<level_list>
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_launcher_background"
android:maxLevel="2" //最大值 最大10000
android:minLevel="1"/> //最小值 最小0
</level-list>
//最大值最小值之间的等级会对应此item中的Drawable。可以通过设置等级切换当前view的背景(setLevel)或者前景(setImageLevel)
7.TransitionDrawable实现两个Drawable之间的淡入淡出操作,对应<transition>标签。
8.InsetDrawable将其他的Drawable内嵌到自己当中,并且可以在四周流出一定间距。对应<inset>标签。
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher_background"
android:inset="1dp" //内嵌边距
android:insetBottom="1dp"
android:insetLeft="1dp"
android:insetRight="1dp"
android:insetTop="1dp">
</inset>
9.ScaleDrawable:根据自己的等级(level)将指定的Drawable缩放到一定比例,对应<scale>标签。
10.ClipDrawable根据自己的等级来裁剪另一个Drawable,对应于<clip>标签。