Android为八进制图形和图片提供了一个典型的2D图形库。在android.graphics.drawable这个包中,你可以找到为绘制二维图形提供的一些普通类。
这篇文档讨论Drawable对象绘制图形最基本的用法,以及怎么使用许多的Drawable子类。查看Drawable Animation章节来查看怎么通过使用Drawable来实现帧动画。
Drawable典型就是一个“一些可以被绘制的东西”的抽象。你会发现Drawable都是用来被其它类继承来实现各种各样可绘制的图形,包括BitmapDrawable, ShapeDrawable, PictureDrawable, LayerDrawable等等。当然,你也可以通过继承这些来自定义Drawable来实现独特的行为。
有三种方式定义和实例化一个Drawable对象:使用你工程中保存的一个图片资源;通过使用XML文件来定义Drawable属性;或者使用一般的构造函数。下面,我们将会讨论前面两种方法(使用构造函数的方法对于熟练的开发者来说都一样的,没什么新奇的不一样)
Creating from resource images
把一个图片添加到工程中的一个简单办法是通过引用你工程资源中的一个图片文件。支持的文件类型包括PNG(最好是这各格式),JPG(也可以接受),以及GIF(不鼓励这种格式)。对于应用程序图标,logos或者其它的图片例如游戏中用到的图片,这种方式将会是最好的选择。
要使用图片资源,你只需要把你的文件放置到你工程的res/drawable目录。这样,你就可以在你的代码中或者XML布局文件中引用这个图片资源。不管哪种方式使用它,你都是通过一个资源ID来引用它的,资源名称是文件名然后不要后缀(例如,my_image.png你可以通过my_image来引用)
注意:在res/drawable下的图片资源在编译的时候将会自动优化,由aapt工具进行无损压缩。例如一个真彩色的png图片如果不需要256种颜色的话将会转化为一个8位的颜色调色板PNG图片。这会导致相同质量的图片需求的内存更少。所以你不且担心资源目录的二进制文件在编译的时候会改变。如果你想把一个图片以位的方式 读进去然后转化为一个bitmap文件,把你的图片文件旋转到res/raw目录,这个目录下的文件在编译的时候不会被优化。
实例:
注意:
你工程中的每个唯一资源只能维持一种状态,不管你从这个资源实例化了多少对象,例如,假如你从同一个资源实例化了两个Drawable对象,然后在其中的某个Drawable中改变某个属性(例如alpha),另一个Drawable也会受到影响。所以如果你想处理一个资源的多个实例,不要直接的去对其做转换而应该使用一个tween animation.
这篇文档讨论Drawable对象绘制图形最基本的用法,以及怎么使用许多的Drawable子类。查看Drawable Animation章节来查看怎么通过使用Drawable来实现帧动画。
Drawable典型就是一个“一些可以被绘制的东西”的抽象。你会发现Drawable都是用来被其它类继承来实现各种各样可绘制的图形,包括BitmapDrawable, ShapeDrawable, PictureDrawable, LayerDrawable等等。当然,你也可以通过继承这些来自定义Drawable来实现独特的行为。
有三种方式定义和实例化一个Drawable对象:使用你工程中保存的一个图片资源;通过使用XML文件来定义Drawable属性;或者使用一般的构造函数。下面,我们将会讨论前面两种方法(使用构造函数的方法对于熟练的开发者来说都一样的,没什么新奇的不一样)
Creating from resource images
把一个图片添加到工程中的一个简单办法是通过引用你工程资源中的一个图片文件。支持的文件类型包括PNG(最好是这各格式),JPG(也可以接受),以及GIF(不鼓励这种格式)。对于应用程序图标,logos或者其它的图片例如游戏中用到的图片,这种方式将会是最好的选择。
要使用图片资源,你只需要把你的文件放置到你工程的res/drawable目录。这样,你就可以在你的代码中或者XML布局文件中引用这个图片资源。不管哪种方式使用它,你都是通过一个资源ID来引用它的,资源名称是文件名然后不要后缀(例如,my_image.png你可以通过my_image来引用)
注意:在res/drawable下的图片资源在编译的时候将会自动优化,由aapt工具进行无损压缩。例如一个真彩色的png图片如果不需要256种颜色的话将会转化为一个8位的颜色调色板PNG图片。这会导致相同质量的图片需求的内存更少。所以你不且担心资源目录的二进制文件在编译的时候会改变。如果你想把一个图片以位的方式 读进去然后转化为一个bitmap文件,把你的图片文件旋转到res/raw目录,这个目录下的文件在编译的时候不会被优化。
实例:
如下的代码小片段演示了如何使用一个图片资源中的一个图片来构造一个ImageView并把它添加到布局文件中去
LinearLayout mLinearLayout;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a LinearLayout in which to add the ImageView
mLinearLayout = new LinearLayout(this);
// Instantiate an ImageView and define its properties
ImageView i = new ImageView(this);
i.setImageResource(R.drawable.my_image);
i.setAdjustViewBounds(true); // set the ImageView bounds to match the Drawable's dimensions
i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
// Add the ImageView to the layout and set the layout as the content view
mLinearLayout.addView(i);
setContentView(mLinearLayout);
在其它的例子中,你可能想以Drawable对象的方式来处理你的image。你可以通过从一个资源来创建一个Drawable来达到此目的,如下 :
Resources res = mContext.getResources();
Drawable myImage = res.getDrawable(R.drawable.my_image);
注意:
你工程中的每个唯一资源只能维持一种状态,不管你从这个资源实例化了多少对象,例如,假如你从同一个资源实例化了两个Drawable对象,然后在其中的某个Drawable中改变某个属性(例如alpha),另一个Drawable也会受到影响。所以如果你想处理一个资源的多个实例,不要直接的去对其做转换而应该使用一个tween animation.
Example XML
如下的XML片段显示了如何添加一个Drawable资源到一个XML布局中的ImageView(将图片渲染为红色)
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tint="#55ff0000"
android:src="@drawable/my_image"/>
想要获取更多的关于工程资源的信息,查看Resources and Assets.