drawable资源是一个图形的通用概念,它表示这个图形可以绘制到屏幕上,可以使用API接口获取,例如getDrawable(int);或应用到另外的XML资源属性中,例如android:drawable和android:icon。有以下几种drawable资源。
Bitmap File——一个位图图形文件(.png,.jpg,.gif)[此处指出了位图就是我们真是可见的图片]。创建一个BitmapDrawable。
Nine-Patch File——一个可扩展的PNG图片(.9.png)。创建一个NinePatchDrawable。
Layer List——操作一组drawables的一个drawable。元素按照索引有序层叠,创建一个LayerDrawable。
StateList——不同的状态指向不同的位图的XML文件。(例如,当按钮按下时使用不同的图片),创建一个StateListDrawable。
LevelList——一个XML文件,它定义了一个操作可选择的一组Drawables的drawable。组中的单个drawable都分配了一个数字,创建一个LevelListDrawable。
Transition Drawable——一个XML文件,定义了在两个drawable资源间逐渐穿过的drawable,创建一个TransitionDrawable。
Inset Drawable——一个XML文件,定义了一个drawable在一个指定的距离插入到另一个drawable中,当一个View需要的背景drawable小于View的真是边界是这个很有用。
Clip Drawable——一个XML文件,定义了一个drawable根据当前的level值,剪切另一个drawable。创建一个ClipDrawable。
Scale Drawable——一个XML文件,定义了一个改变另外的drawable尺寸的drawable,创建一个ScaleDrawable。
ShapeDrawable——一个XML文件,定义了一个包含颜色,倾斜度的几何图形,创建一个ShapeDrawable。
AnimationDrawable——查看Animation Resource文献。
Note:颜色资源也可以作为一个drawable。例如,当创建一个state list drawable时,可以这样指定一个颜色资源属性——android:drawable="@color/green"。
Bitmap
位图,安卓系统支持三中形式的位图:.png(推荐使用),.jpg(可用),.gif(不推荐使用)。(因为计算机只能读取二进制,图片也会转化为二进制,因此称作位图。)
把文件名作为资源ID使用可以直接指向位图,也可以在XML文件中创建一个资源ID别名。
Note:在工程build过程中,系统aapt工具会压缩优化位图。例如,一个不需要256色的真彩PNG图片可能会转化为一个8bitPNG图片。这样的结果是不失真却减小了占用内存。对于位图二进制会变化这一点我们一定要知道。如果我们计划读取一张图片的bit流转化为一个位图,则应该把图片防止在res/raw/文件夹里,这样不会被优化。
Bitmap File
一个bitmap文件是一个.png,.jpg或.gif文件。安卓系统把放置在res/drawable/文件夹里的任何文件都当作Drawable资源。
FILELOCATION:
res/drawable/filename.png(.png,.jpg,.gif)文件名作为资源ID。
COMPILED RESOURCE DATATYPE:
资源指向一个BitmapDrawable
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:drawable/filename
EXAMPLE:
图片保存为res/drawable/myimage.png,应用到一个View控件:
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/myimage"/>
下段代码把图片作为Drawable资源取出:
Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.myimage);
XMl Bitmap
XML bitmap指定义在XML中指向bitmap文件的资源。影响是一个raw bitmap文件的别名。XML可以为位图指定额外的属性比如dithering和tiling。
Note:<bitmap>标签元素可以作为<item>元素的子元素。例如,当创建一个state list或者一个layer list时,可以在<item>元素中去除android:drawable属性,而使用嵌套的<bitmap>定义drawable项目。
FILELOCATION:
res/drawable/filename.xml文件名作为资源ID。
COMPILED RESOURCE DATATYPE:
资源指向一个BitmapDrawable。
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?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:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
ELEMENTS:
<bitmap>——定义bitmap资源和其特性
xmlns:android——XML命名空间,必须是“http://schemas.android.com/apk/res/android”,<bitmap>是根元素时才要求这个属性,嵌套在<item>中时不需要。
android:src——必要的指向一个drawable资源
android:antialias——布尔类型,是否支持锯齿。
android:dither——布尔类型,bitmap与屏幕像素配置不一致是是否支持抖动(例如:ARGB8888bitmap和RGB565屏幕)
android:filter——布尔类型,当bitmap收缩或伸展以平滑它的外观时会用到这个属性
android:gravity——关键字。
android:tileMode——关键字,定义平铺模式,enabled时,bitmap可重复,忽略gravity。
可选常量值如下:
disabled——bitmap不平铺,缺省值
clamp——阴影部分超出边界时复制边缘颜色
repeat——重复使用阴影图片。
mirror——重复使用阴影图片,镜像图片。
EXAMPLE:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/icon"
android:tileMode="repeat" />
Nine-Patch
同bitmap一样,可以指定一个Nine-Patch文件或包含了该资源的XML文件。
Nine-Patch File
FILELOCATION:
res/drawable/filename.9.png文件名作为资源ID
COMPILED RESOURCE DATATYPE:
资源指向NinePatchDrawable
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
EXAMPLE:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/myninepatch"/>
XML Nine-Patch
FILELOCATION:
res/drawable/filename.xml文件名用作资源ID
COMPILED RESOURCE DATATYPE:
资源指向NinePatchDrawable
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?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"] />
ELEMENTS:
<nine-patch>
属性:xmlns:android;android:src;android:dither
EXAMPLE:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/myninepatch"
android:dither="false" />
Layer List
一个LayerDrawable对象操作一组drawables对象。list中的drawable都是有序的。
每一个drawable对象在<layer-list>元素中为一个<item>元素
FILELOCATION:
res/drawable/filename.xml文件名为资源ID
COMPILED RESOURCE DATATYPE:
资源指向一个LayerDrawable
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?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>
ELEMENTS:
<layer-list>
xmlns:android
<item>:
android:drawable
android:id
android:top——整型,顶部偏移距离
android:right;android:bottom;android:left
缺省情况下,所有的drawable items都会按比例伸缩来匹配承载它们的View的尺寸。这样,layer list的images放置在不同位置可能会增加View的尺寸,同时还可能引起image的伸缩。为了避免这一状况,在<item>中使用<bitmap>元素指定drawable资源同时还要定义合适的gravity以避免伸缩。例如"center"。下例的<item>会伸缩以匹配View容器:
<item android:drawable="@drawable/image"/>
避免这种状况的定义如下:
<item>
<bitmap android:src="@drawable/image"
android:gravity="center"/>
</item>
EXAMPLE:
XML文件保存为res/drawable/layers.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<bitmap android:src="@drawable/android_red"
android:gravity="center" />
</item>
<item android:top="10dp" android:left="10dp">
<bitmap android:src="@drawable/android_green"
android:gravity="center" />
</item>
<item android:top="20dp" android:left="20dp">
<bitmap android:src="@drawable/android_blue"
android:gravity="center" />
</item>
</layer-list>
这个layout XML应用了上面的这个drawable如下:
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/layers" />
效果图如下:
State List
StateListDrawable定义在一个XML文件中,它使用了一些不同的图片根据对象状态代表一种图形。例如,Button控件有几种存在状态(pressed, focused,neither),使用state list drawable,就可以为每种状态指定不同的图片。
state list定义在XML文件中,每个图形代表了<selector>元素中的一个<item>。每个<item>有多个属性描述作为图形使用时的状态。
每次状态变化,state list都会从上到下逐一查找合适的<item>,第一个匹配的<item>会被选择,而不是最佳匹配的<item>。
FILELOCATION:
res/drawable/filename.xml文件名作为资源ID
COMPILED RESOURCE DATATYPE:
资源指向一个StateListDrawable
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?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>
ELEMENTS:
<selector>
attributes:
xmlns:android
android:constantSize——布尔值,当state变化而drawable的内部尺寸保持不变时为“true”(尺寸为所有states的最大值),尺寸随状态变化而 变化时为"false",缺省值为false。
android:dither
android:variablePadding——布尔值,drawable的padding随状态变化而变化时为"true",保持不变为"false",缺省值为false。
<item>
attributes:
android:drawable
android:state_pressed——布尔值,该对象状态为pressed时为true,缺省值为false。
android:state_focused——布尔值,对象获取输入焦点(例如用户选择一个文本输入时)时为true,缺省状态为false
android:state_hovered——布尔值,光标悬停时为true。缺省值为false。
android:state_selected——布尔值
android:state_checkable——布尔值,对象checkable时为true(只在对象在一个checkable和non-checkable widget之间切换时有效)
android:state_checked——布尔值
android:state_enabled——对象enabled(能够接收touch/click事件)时为true。
android:state_activated——对象激活时(例如导航视图里选中的item为高亮)为true。
android:state_window_focused——应用窗口获取了焦点时为true(应用到前台)
Note:谨记匹配的是第一个合适的item,而不是最佳item,这也意味着缺省item应该放置在最底部。如下例:
EXAMPLE:
XML文件存储为res/drawable/button.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/button_pressed" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/button_focused" /> <!-- focused -->
<item android:state_hovered="true"
android:drawable="@drawable/button_focused" /> <!-- hovered -->
<item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>
应用到一个按钮如下:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/button" />
Level List
一个组drawable,它管理一组交替使用的drawables。每个drawable分配一个最大数值。setLevel()方法设置drawable的level值,装载drawable资源到level list中,level list有一个android:maxLevel值大于等于传递到setLevel()方法的值。
FILELOCATION:
res/drawable/filename.xml文件名作为资源ID
COMPILED RESOURCE DATATYPE:
资源指向一个LevelListDrawable
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?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>
ELEMENTS:
<level-list>
xmlns:android
<item>
android:drawable
android:maxLevel——该项最大允许值
android:minLevel——该项最小允许值
EXAMPLE:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/status_off"
android:maxLevel="0" />
<item
android:drawable="@drawable/status_on"
android:maxLevel="1" />
</level-list>
应用到一个View中时,使用setLevel()或者setImageLevel()可以改变level值。
Transition Drawable
TanditionDrawable是可以在两个drawable资源间切换的drawable。
每个drawable是<transition>元素下的一个<item>标签。推荐只使用两个标签。向前切换,调用startTransition(),向后切换,调用reverseTransition()。
FILELOCATION:
res/drawable/filename.xml文件名作为资源ID
COMPILED RESOURCE DATATYPE
资源指向TransitionDrawable
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?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>
ELEMENTS:
<transition>
xmlns:android
<item>可接收<bitmap>元素
android:drawable
android:id
android:top,android:right,android:bottom,android:left
EXAMPLE:
XML文件存储为res/drawable/transition.xml
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/on" />
<item android:drawable="@drawable/off" />
</transition>
应用如下:
<ImageButton
android:id="@+id/button"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/transition" />
下面的代码段演示了从第一个item到第二个item的500ms切换。
ImageButton button = (ImageButton) findViewById(R.id.button);
TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();
drawable.startTransition(500);
Inset Drawable
把一个drawable在一个指定距离上插入到另外一个drawable。当一个视图view需要的背景图片小于该视图的边界时很有用。
FILE LOCATION:
res/drawable/filename.xml文件名作为资源ID
COMPILED RESOURCE DATATYPE:
指向一个InsetDrawable
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?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" />
ELEMENTS:
<inset>
xmlns:android
android:drawable
android:insetTop,android:insetRight,android:insetBottom,android:insetLeft必须是一个dimension值或dimsension reource。
EXAMPLE:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/background"
android:insetTop="10dp"
android:insetLeft="10dp" />
Clip Drawable
根据drawable的当前level值由一个drawable剪切另外一个drawable。根据level值可以控制child drawable被剪切了多少。同时还需要一个gravity值控制它们放置在容器中的位置。通常应用在progress bar。
FILELOCATION:
res/drawable/filename.xml文件名应用为资源ID
COMPILED RESOURCE DATATYPE:
资源指向一个ClipDrawable
RESOURCE REFERENCE
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?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"] />
ELEMENTS:
<clip>
xmlns:android
android:drawable——指向被剪切的drawable资源
android:clipOrientation——剪切的方向的关键字
horizontal,vertical
android:gravity——指定drawable中剪切的位置,可以是以下的一个或多个常量(由“|”隔开)。
top——对象放置在容器顶部,不改变尺寸,当clipOrientation是"vertical"时,在drawable底部开始剪切。
bottom——对象放置在容器底部,不改变尺寸,当clipOrientation是"vertical"时,在drawable顶部剪切。
left——对象放置在容器左边缘,不改变尺寸,当clipOrientation是"horizontal"时,在drawable右边剪切。这是缺省状态。
right——对象放置在容器右边缘,不改变尺寸,当clipOrientation是"horizontal"时,在drawable左边剪切。
center_vertical,fill_vertical,center_horizontal,fill_horizontal,center,fill,clip_vertical,clip_horizontal。
EXAMPLE:
XML文件保存为res/drawable/clip.xml
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/android"
android:clipOrientation="horizontal"
android:gravity="left" />
应用到view如下:
<ImageView
android:id="@+id/image"
android:background="@drawable/clip"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
下段代码演示了如何通过增加level值,逐渐显示一副遮住的图片。
ImageView imageview = (ImageView) findViewById(R.id.image);
ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();
drawable.setLevel(drawable.getLevel() + 1000);
增加level值减少剪切量而逐渐显示图片。下图为level值7000。
Note:缺省level值为0,此时图片被完全剪切掉所以是看不见的,当level值为10000时,图片完全可见。
Scale Drawable
根据当前level值改变一个drawable的尺寸。
FILELOCATION:
res/drawable/filename.xml
COMPILED RESOURCE DATATYPE:
资源指向一个ScaleDrawable
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?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" />
ELEMENTS:
<scale>
xmlns:android
android:drawable
android:scaleGravity——改变尺寸之后对象放置在容器中的位置,由下述一个或多个(由“|”隔开)常量决定。
top,bottom,left,right,center_vertical,fill_vertical,center_horizontal,fill_horizontal,center,fill,clip_vertical,clip_horizontal
android:scaleHeight——缩放高,相对于drawable边界的百分比,格式为XX%,例如100%, 12.5%。
android:scaleWidth。
EXAMPLE:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/logo"
android:scaleGravity="center_vertical|center_horizontal"
android:scaleHeight="80%"
android:scaleWidth="80%" />
Shape Drawable
由XML文件定义一个基本图形。
FILELOCATION:
res/drawable/filename.xml文件名用作资源ID。
COMPILED RESOURCE DATATYPE:
资源指向一个GradientDrawable。
RESOURCE REFERENCE:
Java:R.drawable.filename
XML:@[package:]drawable/filename
SYNTAX:
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle" | "oval" | "line" | "ring"] >
<corners
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<gradient
android:angle="integer"
android:centerX="integer"
android:centerY="integer"
android:centerColor="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["linear" | "radial" | "sweep"]
android:useLevel=["true" | "false"] />
<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>
ELEMENTS:
<shape>
xmlns:android
android:shape——定义了基本图形。
rectangle——缺省值
oval,line,ring。
当android:shape="ring"时有以下属性。
android:innerRadius——半径
android:innerRadiusRation,thickness,thicknessRatio,useLevel。
<corners>shape的园角。只应用于rectangle
android:radius,topLeftRadius,topRightRadius,bottomLeftRadius,bottomRightRadius
Note:corner初始化值必须为半径赋值大于1,否则就没有圆角。如果想指定不是圆角,使用android:radius设置缺省半径大于1,然后复写需要的corner的value值,不想要圆角时,设置值为”0dp"
<gradient>——倾斜度
android:angle,centerX,centerY,centerColor,gradientRadius,startColor,type,useLevel。
<padding>
<size>
Note:缺省情况下shape会根据<size>定义的dimension 来scale尺寸以匹配容器view。当应用shape到ImageView时,可以设置android:scaleType为"center"来限制scale。
<solid>——填充到图形的实心色
<stroke>——stroke线
android:width,color,dashGap,dashWidth
EXAMPLE:
XML文件存储为res/drawable/gradient_box.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#FFFF0000"
android:endColor="#80FF00FF"
android:angle="45"/>
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp" />
<corners android:radius="8dp" />
</shape>
应用到View实例如下:
<TextView
android:background="@drawable/gradient_box"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
下段代码演示了应用它到一个View中。
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);