XML Drawable与9-Patches

可绘制对象资源
两种设计工具均属于drawable。Android把任何可绘制在屏幕上的图形图像都称为drawable
drawable可以是一种抽象的图形、一个继承 Drawable 类的子类,或者是一张位图图像。

分类:
drawable:
->位图文件 BitmapDrawable
位图图像。Android 支持以下三种格式的位图文件:.png(首选)、.jpg(可接受)、.gif(不建议)。
当您将这些文件保存到 res/drawable/ 目录中时,Android 将为它们创建 Drawable 资源。
资源引用:
在 Java 中:R.drawable.filename
在 XML 中:@[package:]drawable/filename
->XML 位图
语法:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.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"]    //布尔值。启用或停用 mipmap 提示
android:tileMode=["disabled" | "clamp" | "repeat(不交替)" | "mirror(重复交替)"]
//关键字。定义平铺模式。当平铺模式启用时,位图会重复。重力在平铺模式启用时将被忽略。

/>


->九宫格文件 NinePatchDrawable
->
是一种 PNG 图像,在其中可定义当视图中的内容超出正常图像边界时 Android 缩放的可拉伸区域。
此类图像通常指定为至少有一个尺寸设置为 "wrap_content" 的视图的背景,
而且当视图扩展以适应内容时,九宫格图像也会扩展以匹配视图的大小。
Android 的标准 Button 小部件使用的背景就是典型的九宫格图像,
其必须拉伸以适应按钮内的文本(或图像)。
->XML 九宫格

<?xml version="1.0" encoding="utf-8"?>
<nine-patch
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource"
android:dither=["true" | "false"] //抖动
/>



->图层列表 LayerDrawable
->
是管理其他可绘制对象阵列的可绘制对象。列表中的每个可绘制对象按照列表的顺序绘制,
列表中的最后一个可绘制对象绘于顶部。
每个可绘制对象由单一 <layer-list> 元素内的 <item> 元素表示。
->语法

<?xml version="1.0" encoding="utf-8"?>
<layer-list
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" />
</layer-list>



需要注意的是每个item必须是一个<selector> 元素的子项
->状态列表 StateListDrawable
->
是在 XML 中定义的可绘制对象,它根据对象的状态,使用多个不同的图像来表示同一个图形。
例如,Button 小部件可以是多种不同状态(按下、聚焦或这两种状态都不是)中的其中一种,
而且可以利用状态列表可绘制对象为每种状态提供不同的背景图片。
您可以在 XML 文件中描述状态列表。每个图形由单一 <selector> 元素内的 <item> 元素表示。
每个 <item> 均使用各种属性来描述应用作可绘制对象的图形的状态。
在每个状态变更期间,将从上到下遍历状态列表,并使用第一个与当前状态匹配的项目
—此选择并非基于“最佳匹配”,而是选择符合状态最低条件的第一个项目。
->语法

<?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>


->层级列表 LevelListDrawable
->管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量。
使用 setLevel() 设置可绘制对象的级别值会加载级别列表中
android:maxLevel 值大于或等于传递到方法的值的可绘制对象资源。
->语法

<?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>


->转换可绘制对象 TransitionDrawable
-> 是可在两种可绘制对象资源之间交错淡出的可绘制对象。
每个可绘制对象由单一 <transition> 元素内的 <item> 元素表示。不支持超过两个项目。
要向前转换,请调用 startTransition()。要向后转换,则调用 reverseTransition()。
->语法

<?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>


->插入可绘制对象
->
在 XML 文件中定义的以指定距离插入其他可绘制对象的可绘制对象。
当视图需要小于视图实际边界的背景时,此类可绘制对象很有用。
->语法

<?xml version="1.0" encoding="utf-8"?>
<inset
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:insetTop="dimension"
android:insetRight="dimension"
android:insetBottom="dimension"
android:insetLeft="dimension" 
/>



->裁剪可绘制对象 ClipDrawable
->
在 XML 文件中定义的对其他可绘制对象进行裁剪(根据其当前级别)的可绘制对象。
您可以根据级别以及用于控制其在整个容器中位置的重力,
来控制子可绘制对象的裁剪宽度和高度。通常用于实现进度栏之类的项目。
->语法

<?xml version="1.0" encoding="utf-8"?>
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:clipOrientation=["horizontal" | "vertical"] //裁剪方向
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"] 


//指定可绘制对象中要裁剪的位置
/>
->缩放可绘制对象 ScaleDrawable
->
在 XML 文件中定义的更改其他可绘制对象大小(根据其当前级别)的可绘制对象。
->语法

<?xml version="1.0" encoding="utf-8"?>
<scale
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]//指定缩放后的重力位置
android:scaleHeight="percentage" //缩放高度
android:scaleWidth="percentage" //缩放宽度
/>


->形状可绘制对象 ShapeDrawable
->语法

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle" | "oval" | "line 水平线,此形状需要 <stroke> 元素定义线宽," | "ring"] >
<corners    //为形状产生圆角。仅当形状为矩形时适用。
android:radius="integer" 
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<gradient //指定形状的渐变颜色。
android:angle="integer" //渐变的角度(度),按x轴的方向来判断
android:centerX="float" //渐变中心的相对 X 轴位置(0-1)
android:centerY="float"    //渐变中心的相对 Y 轴位置(0-1)
android:centerColor="integer"//起始颜色与结束颜色之间的可选颜色
android:endColor="color"    //结束颜色
android:gradientRadius="integer" //渐变的半径。仅在 android:type="radial" 时适用。
android:startColor="color"    //开始颜色
android:type=["linear" | "radial" | "sweep"] //渐变类型
android:useLevel=["true" | "false"] //是否用作 LevelListDrawable
/>
<padding //内边距
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer" />
<size    //大小
android:width="integer"
android:height="integer" />
<solid //用纯色填充
android:color="color" />
<stroke    //形状的笔划中线。
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer" />
</shape>


Hold on, everything is possible.
原文地址:https://www.cnblogs.com/student-note/p/6093951.html