第七章 实现炫酷效果—图像和动画(2)

来源:互联网 发布:农村淘宝下载安装2017 编辑:程序博客网 时间:2024/04/30 07:38

7.3 变化多端—Drawable(绘图类)

Drawable资源是Android系统中使用最广泛、最灵活的资源,可以直接使用png、jpg、gif、9.png等图片做为资源文件,也可以使用多种XML文件做为资源文件。

下面详细介绍下各种Drawable资源。

7.3.1Drawable的一些常用子类

Android平台的Drawable代表可以绘制在屏幕上的资源,可以使用getDrawable(int)从资源文件中获取Drawable资源,或者在XML资源文件中采用@drawable方式来引用一个drawable资源。Drawable是一个通用的抽象类,这里有几种Drawable类扩展出的绘图的类:

l  BitmapDrawable—Bitmap File,一个Bitmap图像文件(.png、.jpg或.gif)。

l  NinePatchDrawable—Nine-Patch File,一个带有伸缩区域的PNG文件,可以基于content伸缩图片(.9.png)。

l  StateListDrawable—State List,一个XML文件,为不同的状态引用不同的Bitmap图像(例如,当按钮按下时使用不同的图片)。

l  PaintDrawable—Color,定义在XML中的资源,指定一个矩形(圆角可以有)的颜色。

l  ShapeDrawable—Shape,一个XML文件,定义了一个几何形状,包括颜色和渐变。

l  AnimationDrawable—Animation动画。

 

经验分享:

Android中不允许图片资源的文件名中出现大写字母,并且不能以数字开头。否则将无法为该图片在R中生成资源索引。这点需要特别注意一下。

 

7.3.2BitmapDrawable

BitmapDrawable是位图转换而成,一般它的资源文件放在res/drawable/目录下,文件名会被当作资源ID使用。例如:

在res/drawable/myimage.png位置保存了一张图片,在LayoutXML中可以应用这个图片到一个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);

7.3.3点九图片—NinePatchDrawable

NinePatchDrawable绘画的是一个可以伸缩的位图图像,Android会自动调整大小来容纳显示的内容。NinePatch常被用在设置View的背景。NinePatch与一般图片被设置为背景最大的区别就是NinePatch可以有一段图片不被拉伸。

NinePatchDrawable是一个标准的PNG图像,它包括额外的1个像素的边界,你必须保存它后缀为.9.png,并且保持到工程的res/drawable目录中。你可以使用Android自带的工具(\android-sdk\tools\draw9patch.bat)来进行NinePatch的制作。这个1个像素的边界是用来确定图像的可伸缩和静态区域。

左边那条黑色线代表图片垂直拉伸的区域。

上边的那条黑色线代表水平拉伸区域。

他们的交集就区域代表就垂直拉伸和水平拉伸都可以进行的区域。

右边的黑色线代表内容绘制的垂直区域。

下边的黑色线代表内容绘制的水平区域。

他们交集的区域就是内容所要绘制到的区域(android:padding的效果)。

下面的示意图7-1可能更方便理解。

图7-1 九图工具效果图

 

经验分享:

制作点九图片的时候,如果下边和右边的黑线不是连续的,那它将按最左端(上端)和最右端(下端)组成的线段来算内容区域。右边和下边的线是可选的,左边和上边的线不能省略。

点九图片是用在拉伸的情况下,需要注意拉伸的部分会变形。那么如果我们不需要拉伸,只需要重复的平铺怎么办?可以使用BitmapDrawable来实现:

// 获取出图片

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resID);

// 转换成BitmapDrawable

BitmapDrawable bd = new BitmapDrawable(bitmap);

// 设置平铺的方向为X、Y(横、竖)两个方向

bd.setTileModeXY(TileMode.REPEAT , TileMode.REPEAT );

// 设置平铺的方向为X(横)方向

// bd.setTileModeX(TileMode.REPEAT );

// 设置图片的抖动为true。抖动可以使渐变更平滑,使原来会有间断线或色块的问题解决,但是不会使一个透明渐变的黑线消失。

bd.setDither(true);

// 设置为背景,就能达到自动平铺的效果。

view.setBackgroundDrawable(bd);

 

7.3.4会动的图片—StateListDrawable

StateListDrawable是定义在XML中的Drawable对象,能根据状态来呈现不同的图像。例如,Button存在多种不同的状态(pressed、focused或other)。使用StateListDrawable,你可以为Button的每个状态提供不同的按钮图像。也可以在XML文件中描述状态列表。在<selector>元素里的每个<item>代表每个图像,每个<item>使用不同的特性来描述使用的时机。当每次状态改变时,StateList都会从上到下遍历一次,第一个匹配当前状态的item将被使用——选择的过程不是基于“最佳匹配”,只是符合state的最低标准的第一个item。

下面举个简单的例子.

先看XML文件,此文件保存在res/drawable/selecter_btn.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:drawable="@drawable/button_normal" /> <!-- default -->

</selector>

 

将这个Drawable应用到一个View上,使用的方法和使用Drawable一样。

<ImageView

    android:layout_height="wrap_content"

    android:layout_width="wrap_content"

    android:src="@drawable/selecter_btn" />

7.3.5 颜色填充的另一种方法—PaintDrawable

PaintDrawable是定义在XML中的color,可以当作Drawable使用,来填充矩形区域(圆角可以有)。这种Drawable的行为很像是颜色填充。

下面我们来看个简单的例子。

XML文件保存在res/drawable/color_name.xml。

<?xml version="1.0" encoding="utf-8"?>

<resources>

<drawable name="solid_red">#f00</drawable>

<drawable name="solid_blue">#0000ff</drawable>

</resources>

 

将这个Drawable应用到一个View上。

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="@drawable/solid_blue" />

 

经验分享:

Color Drawable是一种简单的资源,可以使用name特性来引用其值(不再是XML文件的名)。因此,你可以在一个XML文件中的<resources>元素下添加多个Color Drawable。

0 0
原创粉丝点击