Android Resource Types之Drawable简介

原创 2015年11月19日 20:45:57

参考《Android开发艺术探索》
参考Kilnn的博客
官方文档:Drawable Resources

Drawable Resources

Drawable资源表示的是一个可在屏幕上绘制的图形的概念,可通过Api函数getDrawable(int)方法获取,或者在其他XML布局文件中使用android:drawable和android:icon属性引用。

1.Bitmap File

编译的资源数据类型:BitmapDrawable。
位图图形文件(.png, .jpg, or .gif).

2.Nine-Patch File

编译的资源数据类型:NinePatchDrawable。
一个可根据内容调整大小的具有伸缩域的PNG文件。

3.Layer List

编译的资源数据类型:LayerDrawable。
包含一组Drawables资源文件,这些资源文件按顺序绘制,具有最大索引的元素绘制在顶部。

4.State List

编译的资源数据类型:StateListDrawable。
一个Drawable集合,每个Drawable对应着View的一种状态,根据View的状态显示合适的Drawable。

5.Level List

编译的资源数据类型:LevelListDrawable。
一个Drawable集合,集合中的每个Drawable都有一个等级的概念。根据不同的等级显示对应的Drawable。

6.Transition Drawable

编译的资源数据类型:TransitionDrawable。
实现两个Drawable之间的淡入淡出效果。

7.Inset Drawable

编译的资源数据类型:InsetDrawable。
将其他Drawable内嵌到自己当中,并可以在四周留出一定的距离。
当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现。

8.Clip Drawable

编译的资源数据类型:ClipDrawable。
根据被剪裁Drawable的当前等级来裁剪此Drawable。

9.Scale Drawable

编译的资源数据类型:ScaleDrawable。
根据自己当前等级将指定的Drawable缩放到一定比例。

10.Shape Drawable

编译的资源数据类型:GradientDrawable。
定义几何形状,包括颜色和渐变。

文件位置:

res/drawable/filename.xml

文件引用:

In Java: R.drawable.filename
In XML: @[package:]drawable/filename

1.Bitmap

1.1Bitmap File
1.1.1例子:
将图片保存在res/drawable/myimage.png,并在布局文件中引用图片:

<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);

1.2XML Bitmap
1.2.1句法:

<?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"] />

android:src,图片的资源id。
android:antialias,是否开启图片抗锯齿功能。
android:dither,是否开启图片抖动效果。
android:filter,是否开启过滤效果。
android:gravity,当图片小于容器的尺寸时,设置此选项可以对图片进行定位。
android:tileMode,平铺模式。

disable表示关闭平铺模式。
repaet表示简单水平和竖直方向上的平铺效果。
mirror表示在水平和竖直方向上的镜面投影效果。
clamp表示图片四周的像素会扩展到周围区域。

1.2.2例子:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/icon"
    android:tileMode="repeat" />

2.Nine-Patch

2.1Nine-Patch File
2.1.1例子:
将图片保存在res/drawable/myninepatch.9.png,并在布局文件中引用图片:

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/myninepatch" />

2.2XML Nine-Patch
2.2.1句法:

<?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"] />

2.2.2例子:

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

3.Layer List

3.1句法:

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

一个layer-list中可以包含多个item,每个item表示一个Drawable。layer-list有层次的概念,下面的item会覆盖上面的item,通过合理的分层,可以实现一些特殊的叠加效果。

android:drawable,直接引用一个已有的Drawable资源,也可以在item中自定义Drawable。
android:top,Drawable想对于View的上偏移量。
android:right,Drawable想对于View的右偏移量。
android:bottom,Drawable想对于View的下偏移量。
android:left,Drawable想对于View的左偏移量。

3.2例子:
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>

在布局文件中引用:

<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/layers" />

效果图:

4.State List

4.1句法:

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

android:constantSize

true表示StateListDrawable的固有大小保持不变,此时固有大小是内部所有Drawable固有大小的最大值,
false表示StateListDrawable的固有大小会随着状态的改变而改变,
默认为false。

android:dither

是否开启抖动效果,开启此选项可以让图片在低质量的屏幕上仍然获得较好的显示效果,默认为true。

android:variablePadding

true表示StateListDrawable的padding会随着状态的改变而改变,
false表示StateListDrawable的padding是内部所有Drawable的padding的最大值,
默认值为false。

android:state_pressed,是否按下。
android:state_focused,是否获得获得焦点。
android:state_hovered,鼠标在上面滑动的状态,通常和state_focused使用同样的drawable。
android:state_selected,是否选中。
android:state_checkable,是否可以被勾选,只能用在可以勾选的控件上。
android:state_checked,是否被勾选上。
android:state_enabled,是否可用。
android:state_activated,是否被激活并持久的选择。
android:state_window_focused,当前应用程序是否获得焦点。

系统会根据View当前的状态从selector中选择对应的item,每个item对应着一个具体的Drawable,系统按照从上到下的顺序查找,直至查找到第一条匹配的item。一般来说,默认的item都应该放在selector的最后一条并且不附带任何的状态,这样当上面的item都无法匹配View的当前状态时,系统就会选择默认的item,因为默认的item不附带状态,所以它可以匹配View的任何状态。

4.2例子:
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" />

5.Level List

5.1句法:

<?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:minLevel和android:maxLevel来指定,在最小值和最大值之间的等级会对应此item中的Drawable。
可通过Drawable的setLevel()方法来设置不同的等级从而切换具体的Drawable,如果它被用来作为ImageView的前景Drawable,还可通过ImageView的setImageLevel()方法来切换Drawable。

5.2例子:

<?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等级。

6.Transition Drawable

6.1句法:

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

android:top,与顶部的距离。
android:right,与右边的距离。
android:bottom,与下边的距离。
android:left,与左边的距离。

6.2例子:
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" />

下面代码执行500ms内从第一个item过渡到第二个item的效果。

ImageButton button = (ImageButton) findViewById(R.id.button);
TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();
drawable.startTransition(500);

7.Inset Drawable

7.1句法:

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

android:insetTop,与顶部的距离,可以使一个尺寸值,或者一个尺寸的资源。
android:insetRight,与右边的距离,可以使一个尺寸值,或者一个尺寸的资源。
android:insetBottom,与底部的距离,可以使一个尺寸值,或者一个尺寸的资源。
android:insetLeft,与左边的距离,可以使一个尺寸值,或者一个尺寸的资源。

7.2例子:

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

8.Clip Drawable

8.1句法:

<?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"] />

android:clipOrientation,表示剪裁方向,有水平和竖直两个方向。
android:gravity,指定drawable的剪裁区域(保留下来的区域)。

Drawable的等级(level)是有范围的,即0-10000,对于ClipDrawable来说,等级0表示完全剪裁,即整个Drawable都不可见了,而等级10000表示不剪裁,默认的level是0。

8.2例子:
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" />

在布局文件中引用:

<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);

效果图:

9.Scale Drawable

9.1句法:

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

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

9.2例子:

<?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%" />

10.Shape Drawable

10.1句法:

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

android:shape

表示图形的形状,有四个选项:rectangle,oval,line和ring。

针对ring这个形状,有5个特殊的属性:

android:innerRadius,圆环的内半径。
android:innerRadiusRatio,圆环的厚度,即外半径减去内半径的大小。
android:thickness,内半径占整个Drawable宽度的比例,默认值是9.如果为n,那么内半径=宽度/n。
android:thicknessRatio,厚度占整个Drawable宽度的比例,默认值为3。如果为n,那么厚度=宽度/n。
android:useLevel,一般为false,除非它被当作LevelListDrawable来使用。

corners

表示shape的四个角的角度,只适用于矩形shape。
android:radius,为四个角同时设定相同的角度,优先级较低,会被其他四个属性覆盖。
android:topLeftRadius,设定左上角的角度。
android:topRightRadius,设定右上角的角度。
android:bottomLeftRadius,设定左下角的角度。
android:bottomRightRadius,设定右下角的角度。

gradient

与<solid>标签是互相排斥的,表示渐变效果。
android:angle,渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90表示从下到上。
android:centerX,渐变中心点的横坐标。
android:centerY,渐变中心点的纵坐标。
android:centerColor,渐变的中间色。
android:endColor,渐变的结束色。
android:gradientRadius,渐变半径,仅当android:type="radial"时有效。
android:startColor,渐变的起始色。
android:type,渐变的类别,有linear(线性渐变),radial(径向渐变),sweep(扫描渐变),默认为线性渐变。
android:useLevel,一般为false,除非它被当作StateListDrawable来使用。

padding

内容与视图边界的距离。
android:left,左边填充距离。
android:top,顶部填充距离。
android:right,右边填充距离。
android:bottom,底部填充距离。

size

shape的固有大小,但作为View的背景时,shape还会被拉伸或者缩小为View的大小。
android:height,高度。
android:width,宽度。

solid

与<gradient>标签是互相排斥的,表示纯色填充。
android:color,颜色值,十六进制数,或者一个Color资源。

stroke

Shape的描边,当android:shape="line"的时候,必须设置此元素。
android:width,描边的宽度。
android:color,描边的颜色。
android:dashGap,组成虚线的线段之间的间隔。
android:dashWidth,组成虚线的线段的宽度。

10.2例子:
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>

在布局文件中引用:

<TextView
    android:background="@drawable/gradient_box"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

获取shape drawable对象并应用于View:

Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);

TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android Drawable Resource

  • 2015年01月16日 19:26
  • 8.81MB
  • 下载

Android API Guides---More Resource Types

更多资源类型 此页面定义更多类型你可以外部化,包括资源: Bool 携带一个布尔值XML资源。 Color 承载颜色值(十六进制的颜色)XML资源。 Dimension 携带一维值(用计...

Android API Guides 之 App Resources(8) - Resource Types - Color

Color State List Resource SEE ALSO Color (simple value) A ColorStateList is an ...

Android 4.0 开发者指南(27) —— Resource Types - String

一下内容转载自 :http://www.cnblogs.com/over140/archive/2011/10/20/2218560.html#Formating_and_Styling ...
  • hustpzb
  • hustpzb
  • 2012年02月13日 21:59
  • 553

Android API Guides 之 App Resources(10) - Resource Types - Layout

Layout Resource SEE ALSO Layouts A layout resource defines the architecture for t...

Android API Guides 之 App Resources(7) - Resource Types - Animation

Animation Resources IN THIS DOCUMENT Property AnimationView Animation Tween animati...

Android API Guides 之 App Resources(11) - Resource Types - Menu

Menu Resource SEE ALSO Menus A menu resource defines an application menu (Options...

Android Drawable Resource 学习笔记

Drawable Resource 学习笔记。
  • zgh0711
  • zgh0711
  • 2017年04月26日 18:46
  • 104

Android Drawable Resource学习(二)、BitmapDrawable和Bitmap

转自:http://blog.csdn.net/lonelyroamer/article/details/8147542 ...

Android Drawable Resource学习(一)、Drawable Resource简介

转自:http://blog.csdn.net/lonelyroamer/article/details/8148147 Drawable Resource 一个Drawa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Resource Types之Drawable简介
举报原因:
原因补充:

(最多只允许输入30个字)