Android开发指南-二维图形 收藏
二维图形2D Graphics
Android 提供一个定制的2D图形库,用来绘制图形图像和制作动画。你将从和android.view.animation包中到这些通用类。
本文简单介绍如何在Android应用程序中进行画图。我们将讨论使用Drawable对象画图的基础知识,如何使用几个Drawable子类,以及如何创建动画,一个图形的补间动画或者一系列图形的连续动画(就像电影胶卷一样)。
可绘制物Drawables
一个Drawable 是一个“某些可以被绘制的物体”的一般抽象你将发现这个Drawable类扩展了多种具体可绘制图形类,包括BitmapDrawableShapeDrawablePictureDrawableLayerDrawable等等。当然,你还可以扩展这些类来定义你自己的具有独特行为的可绘制对象。
有三种方式来定义和实例化一个Drawable:使用一个保存在你的项目资源中的图像;使用一个定义了Drawable属性的XML文件;或者使用通常的类构造函数。下面,我们将挨个讨论前面两种方法(对于一个经验丰富的开发人员而言,使用构造函数没什么新意)。
html animation属性从资源图像中创建Creating from resource images
一个为你的应用程序增加图形的简单方法是通过引用项目资源中的一个图片文件。支持的图片文件格式有PNG(推荐的),JPG(可接受的)和GIF(不鼓励的)。这个技术将显然推荐使用在应用程序图标,logo,或者其它类似使用于游戏中的图形。
为了使用一个图片资源,只要把你的文件添加到你项目的res/drawable/目录即可。从那里,你可以在代码或XML布局中进行引用。任何一种方式,都是通过资源ID来引用,资源ID是不带扩展后缀的文件名(比如,my_image.png通过my_image来引用)
注意: 图像资源被放在res/drawable/里。也许会通过aapt工具进行无损图像压缩而被自动优化。比如,一个不需要多于256的真彩PNG图片可能会被转换成一个带有调板的8PNG。这产生了相同质量但占用更少内存的图片。因此需要意识到该目录下的二进制图像可
能会在编译期间被改变。如果你想以比特流读取一个图片并转换为一个位图,那么需要把你的图片文件放在res/raw/目录,这里的文件不会被优化。
示例代码Example code
下面的代码片断说明了如何构造一个ImageView,从drawable资源中使用并添加到布局中。
LinearLayout mLinearLayout;
 
protected void onCreate(Bundle savedInstanceState) {
    Create(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(_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对象。为此,你可以这样做:
Resources res = Resources();
Drawable myImage = Drawable(_image);
注意: 每个你项目里的唯一资源只能维护一个状态,而无论你为它实例化了多少个不同对象。比如,如果你从相同的图像资源实例化两个可绘制对象,然后改变其中之一的属性(比如alpha),那它也将作用于另一个。所以当处理一个图片资源的多个实例时,你应该实施一个tween animation,而不是直接转换这个可绘制对象。
 
示例XML
下面的XML片断显示了如何添加一个可绘制资源到一个XML布局中的ImageView里(为了有趣些,添加一些红渲染)。
<ImageView 
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:tint="#55ff0000"
  android:src="@drawable/my_image"/>
更多关于使用项目资源的信息,请阅读资源和资产Resources and Assets
从资源XML中创建Creating from resource XML
到目前为止,你应该对Android用户界面User Interface开发原理比较熟悉。因此,你应该了解在XML中定义对象所固有的能力和灵活性。这个理念从视图延伸到可绘制对象。如果你
想创建一个可绘制(Drawable)对象,而它并不初始依赖于你代码中的变量或者用户交互,那么在XML里面定义它是个好的选择。即便你预期这个可绘制对象在用户使用你的应用程序时将会改变其属性,你也应该考虑在XML里面定义它,因为一旦被实例化后,你就可以修改它的属性。
一旦你在XML中定义了你的可绘制对象,把这个文件保存到你项目中的res/drawable/ 目录下。然后,通过传递资源ID参数调用获取并实例化这个对象。 (参见example below.
任何支持inflate()方法的可绘制对象(Drawable)子类可以在XML里定义并由你的应用程序实例化。每个支持XML扩充的可绘制对象利用特定的XML属性来帮助定义对象属性(参见类参考了解这些属性)。查阅每个可绘制对象子类的类描述文档,以获知如何在XML中定义它。
例子Example
下面是一些定义了一个TransitionDrawable对象的XML语句:
<transition xmlns:android="schemas.android/apk/res/android">
  <item android:drawable="@drawable/image_expand">
  <item android:drawable="@drawable/image_collapse">
</transition>
当把这个XML保存为res/drawable/l文件后,下面的代码将用来实例化它并把它设置为一个ImageView的内容:
Resources res = Resources();
TransitionDrawable transition = (TransitionDrawable) Drawable(pand_collapse);
ImageView image = (ImageView) findViewById(le_image);
image.setImageDrawable(transition);
然后通过下面的方法让这个transition运转起来(每1秒转变一次):
transition.startTransition(1000);
请参考上面所列的可绘制对象(Drawable)类以了解更多它们所支持的XML属性。
可绘制形状ShapeDrawable
当你想动态的画一些二维图形时,ShapeDrawable对象可能会满足你的要求。 通过一个ShapeDrawable,你可以绘制原始图形和以任何想象得到的方式设计它们
ShapeDrawableDrawable的一个扩展类,因此你能使用在任何可用Drawable的地方也许是视图背景,用setBackgroundDrawable()方法来设置。当然,你还能以它自己的视图来绘制图形,并添加到你的布局中只要你乐意。因为ShapeDrawable有它自己的draw()方法,你可以创建一个视图子类在Draw()方法中绘制这个ShapeDrawable。下面这个视图类的一个基本扩展就是这么做的,把ShapeDrawable作为一个视图来绘制。
public class CustomDrawableView extends View {
    private ShapeDrawable mDrawable;
 
    public CustomDrawableView(Context context) {
        super(context);
 
        int x = 10;
        int y = 10;
        int width = 300;
        int height = 50;
 
        mDrawable = new ShapeDrawable(new OvalShape());
        Paint().setColor(0xff74AC23);
        mDrawable.setBounds(x, y, x + width, y + height);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。