Android画图学习总结(三)——Drawable

By: 海市蜃楼 | In: Android开发

17 2009

Android SDK提供了一个强大的类Drawable,Drawable这个抽象类到底代表了什么,如何使用?Drawable是个很抽象的概念,通过简单的例子程序来学习它,理解它。先看个简单的例子,使用Drawable的子类ShapeDrawable来画图,如下:
public class testView extends View {
private ShapeDrawable mDrawable;
public testView(Context context) {
super(context);
int x = 10;
int y = 10;
int width = 300;
int height = 50;
mDrawable = new ShapeDrawable(new OvalShape());
mDrawable.getPaint().setColor(0xff74AC23);
mDrawable.setBounds(x, y, x + width, y + height);
}
protected void onDraw(Canvas canvas)
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);//画白色背景
mDrawable.draw(canvas);
}
}
程序的运行结果,显示如下:

ShapDrawable 简要解析:

  1. 创建一个OvalShape(一个椭圆);
  2. 使用刚创建的OvalShape构造一个ShapeDrawable对象mDrawable
  3. 设置mDrawable的颜色;
  4. 设置mDrawable的大小;
  5. 将mDrawable画在testView 的画布上;

这个简单的例子可以帮我们理解什么是Drawable,Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象,就可以将这个可画对象当作一块“画布(Canvas)”,在其上面操作可画对象,并最终将这种可画对象显示在画布上,有点类似于“内存画布“。

上面只是一个简单的使用Drawable的例子,完全没有体现出Drawable的强大功能。Android SDK中说明了Drawable主要的作用是:在XML中定义各种动画,然后把 XML当作Drawable资源来读取,通过Drawable显示动画。下面举个使用TransitionDrawable 的例子,创建一个Android工程,然后再这个工程的基础上修改,修改过程如下:
1、去掉layout/main.xml中的TextView,增加ImagView,如下:
<ImageView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:tint=”#55ff0000″
android:src=”@drawable/my_image”/>

2、创建一个XML文件,命名为expand_collapse.xml,内容如下:
<?xml version=”1.0″ encoding=”UTF-8″?>
<transition xmlns:android=”http://schemas.android.com/apk/res/android”>
<item android:drawable=”@drawable/image_expand”/>
<item android:drawable=”@drawable/image_collapse”/>
</transition>
需要3张png图片,存放到res\drawable目录下,3张图片分别命名为:my_image.png、image_expand.png、image_collapse.png。

3、修改Activity中的代码,内容如下:
LinearLayout mLinearLayout;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLinearLayout = new LinearLayout(this);
ImageView i = new ImageView(this);
i.setAdjustViewBounds(true);
i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mLinearLayout.addView(i);
setContentView(mLinearLayout);
Resources res = getResources();
TransitionDrawable transition =
(TransitionDrawable) res.getDrawable(R.drawable.expand_collapse);
i.setImageDrawable(transition);
transition.startTransition(10000);
}

4、如果修改的没有错误,运行程序,结果显示如下:
初始图片
TransitionDrawable-begin
过渡中的图片
TransitionDrawable-mid
最后的图片
TransitionDrawable-end

屏幕上动画显示的是: 从图片image_expand.png过渡到image_collapse.png,也就是我们在expand_collapse.xml中定义的一个transition动画。看完这个例子,你对Drawable的理解是否又深入些?这里提供这个程序的源代码,供大家下载,可以在这个例子的基础上去体会其他的Drawable,来加深对Drawable的理解。

总结说明

通过以上2个例子程序,相信对Drawable会有一定的认识了,在以后的篇幅中会介绍更多的例子,更加深入的学习和理解Drawable。具体还有哪些Drawable,大家到Android SDK去深入学习吧。

相关文章

20 Responses to Android画图学习总结(三)——Drawable

Avatar

lype

九月 18th, 2009 at 1:46 下午

是否有联系方式呢?邮箱什么的

Avatar

海市蜃楼

九月 18th, 2009 at 2:58 下午

欢迎与大家交流Android开发方面的,可以直接在本博客留言或者发邮件至wangzongjunvip@163.com

Avatar

qingyun

十一月 3rd, 2009 at 11:54 上午

说真的,哥们写的东西确实不错啊

Avatar

海市蜃楼

十一月 3rd, 2009 at 12:55 下午

谢谢,与大家分享我们的博客,我们自己也会提高很多。

Avatar

qingyun

十一月 5th, 2009 at 9:44 上午

问个小问题:
color按rgb来说是6位16进制数,可是这里为什么是8位的
我在做这个例子的时候如果用六位会显示不出图像
可否给指导依稀啊,谢谢
mDrawable.getPaint().setColor(0xff74AC23);

Avatar

海市蜃楼

十一月 5th, 2009 at 11:24 上午

查看 android.graphics.Color中一些常用颜色的定义,如下
public static final int BLACK — Constant Value: -16777216 (0xff000000)
public static final int BLUE — Constant Value: -16776961 (0xff0000ff)
这里就可以看出来,RGB24的确是6位,最高为扩充FF就是8位了(RGB32);
不过这个也可能是透明度(alpha)设置,把最高为设置为80看下是不是显示的就是半透明的了;

Avatar

qingyun

十一月 5th, 2009 at 1:07 下午

确实如你所说,我测试了一下看来高两位是控制alpha的
00完全透明 ff完全不透明

Avatar

Cialis

三月 12th, 2010 at 3:38 上午

vQEhHi Excellent article, I will take note. Many thanks for the story!

Avatar

low cost links

五月 7th, 2010 at 2:57 下午

Cool site.

Avatar

fairzy

六月 21st, 2010 at 6:06 下午

testView, 类的命名首字母大写,基本习惯

Avatar

afan_321

六月 22nd, 2010 at 4:29 下午

very good.

Avatar

afan_321

六月 22nd, 2010 at 4:31 下午

大家知道drawable 中的padding是什么意思?

Avatar

Wikipedia YouTube

七月 20th, 2010 at 4:46 上午

That Nxqx is awe inspiring.

http://en.wikipedia.org/wiki/Youtube – Wikipedia YouTube

Wikipedia YouTube

Avatar

Android画图处理(转) | Acr_Host

九月 26th, 2010 at 4:20 下午

[...] Drawable是个抽象类,在BitmapDrawable中我们就看到位图的具体操作,在仔细看下BitmapDrawable的构造函数,我们就会发现与Resource中的openRawResource()接口是相对应的,就可以通过以下方法来获取位图: Resources r = this.getContext().getResources(); Inputstream is = r.openRawResource(R.drawable.my_background_image); BitmapDrawable  bmpDraw = new BitmapDrawable(is); Bitmap bmp = bmpDraw.getBitmap(); 关于Drawable深入的学习与理解,请阅读Android画图学习总结(三)——Drawable [...]

Avatar

xh

十一月 28th, 2010 at 11:13 上午

mo-android 为我们 E文不好的 人 创造了好东西。 谢谢,继续写下去吧 加油。

Avatar

xh

十一月 28th, 2010 at 12:32 下午

这个例子 提供的源码应该是 Android画图学习总结(二)——Bitmap 的源码吧 好像不是这个例子的源码。。

Avatar

leo

二月 1st, 2011 at 6:30 下午

TransitionDrawable 的例子 运行失败

Avatar

leo

二月 1st, 2011 at 6:31 下午

expand_collapse.xml是放在drawable文件夹,还是放在layout文件夹呢?

Avatar

leo

二月 1st, 2011 at 6:34 下午

前辈请指教。。。help me

Avatar

sunny78117

八月 17th, 2012 at 9:09 上午

提供的源码是 Android画图学习总结(二)——Bitmap 的源码
不是这个例子的源码

Comment Form

About mo-Android

这里有一群热爱开发的人,我们的文章以原创、翻译为主,包含了我们对Android的认识,对Android的研究,以及一些开发心得和感想,如果 你喜欢我们的站点,喜欢我们的文章,欢迎拍砖,欢迎交流。希望新版的mo-Android能够为你带来更好的体验。

Calendar

2013年五月
« 三    
 12345
6789101112
13141516171819
20212223242526
2728293031