注:本文译自:
Android框架API提供了一组2D描画API,使用这些API能够在一个画布(canvas)上渲染自己的定制图形,也能够修改那些既存的View对象,来定制它们的外观和视觉效果。在绘制2D图形时,通常要使用以下两种方法中的一种:
1. 把图形或动画绘制到布局中的一个View对象中。在这种方式中,图形的绘制是由系统通常的绘制View层次数据的过程来处理的---只需简单的定义要绘制到View对象内的图形即可。
2. 把图形直接绘制在一个画布对象上(Canvas对象)。这种方法,要亲自调用相应类的onDraw()方法(把图形传递给Canvas对象),或者调用Canvas对象的一个draw…()方法(如drawPicture())。在这个过程中,还可以控制任何动画。
当想要把不需要动态变化和没有游戏性能要求的一个简单的图形绘制到View对象时,方法一是最好的选择。例如,在想要在一个静态的应用程序中,显示一个静态图形或预定义动画时,就应该用方法1把图形绘制到一个View对象中。
当应用程序需要经常重新绘制自己的时候,使用方法2把图形绘制到Canvas中,是一个比较好的选择。像视频游戏这样的应用程序,就应该在它们自己的Canvas对象上绘制图形。但是,有更多的方法来完成绘制任务:
1. 在与UI的Activity相同的线程中,创建布局中一个定制的View对象组件,就先要调用invalidate()方法,然后处理onDraw()回调方法;
2. 在一个独立的线程中,管理着SurfaceView对象,并且使用线程来执行把图形绘制到Canvas对象上的任务(不需要请求invalidate()方法)。
用Canvas对象来绘制图形(Draw with a Canvas)
当要编写专业的绘图或控制图形动画的应用程序时,应该使用Canvas对象来尽心绘制操作。Canvas用一个虚拟的平面来工作,以便把图形绘制在实际的表面上---它持有所有的用draw开头的方法调用。通过Canvas对象,实际上是执行一个底层的位图绘制处理,这个位图被放置到窗口中。
在onDraw()回调方法的绘制事件中,会提供一个Canvas对象,并且只需要把要绘制的内容交给Canvas对象就可以了。在处理SurfaceView对象时,还可以从SurfaceHolder.lockCanvas()方法来获取一个Canvas对象。但是,如果需要创建一个新的Canvas对象,那么就必须在实际执行绘制处理的Canvas对象上定义Bitmap对象。对于Canvas对象来说,这个Bitmap对象是始终必须的,应该像以下示例这样建立一个新的Canvas对象:
Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);Canvas c = new Canvas(b);
现在就可以在被定义的Bitmap对象上绘图了。在Canvas对象上绘制图形之后,能够用Canvas.drawBitmap(Bitmap, …)的一个方法,把该Bitmap对象绘制到另一个Canvas对象中。通过View.onDraw()方法或SufaceHolder.lockCanvas()方法提供的Canvas对象来完成最终的图形绘制处理是被推荐的。
Canvas类有可以使用的自己的一组绘图方法,如drawBitmap(…)、drawRect(…)、drawText(…)等。还可以使用其他的有draw()方法类。例如,可能想要把某些Drawable对象放到Canvas对象上。Drawable类就有带有Canvas对象作为参数的draw()方法。