android graphic:canvas
canvas中包含了作图的方法。 完成作图过程,最基本的四大组件是,canvas, bitmap, drawing prmitive, paint. 其中canvas是画布,包含了作图的方法。作图方法最终需要保存在bitmap当中。 作图的图元,如矩形,轨迹,字,bitmap(是一个图形),paint相当于颜料,它指定了作图的颜色和作图的风格。
利用canvas作图,有几种方法,一般而言,用户使用view布局作图,这种方法适合对性能不敏感,并且控件不需要动态改变的情况。
如果用户需要自己作图,如video game。则有两种方法。
1)可以直接利用view,重载onDraw方法,调用canvas的drawing calls来作图;这种作图过程占用的是UI thread.
2) 或者利用surfaceview作图。这种作图方法会创建单独的thread,作图更快速。
以上的总结来自于这篇文章,它介绍了如何使用canvas作图的基本方法。
下面两篇文章给出了实例,如何在canvas上,利用custom view作图
下面的代码实例中,显示了如何利用canvas 往surfaceview作图。
package org.example.sudoku; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.SurfaceHolder.Callback; import android.view.animation.Animation; public class MySurfaceView extends SurfaceView implements Callback, Runnable {// 备注1 private SurfaceHolder sfh; private Thread th; private Canvas canvas; private Paint paint; private int ScreenW, ScreenH; public MySurfaceView(Context context) { super(context); th = new Thread(this); sfh = this.getHolder(); sfh.addCallback(this); // 备注1 paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.RED); this.setKeepScreenOn(true);// 保持屏幕常亮 } @Override public void startAnimation(Animation animation) { super.startAnimation(animation); } public void surfaceCreated(SurfaceHolder holder) { ScreenW = this.getWidth();// 备注2 ScreenH = this.getHeight(); th.start(); } private void draw() { try { canvas = sfh.lockCanvas(); // 得到一个canvas实例 canvas.drawColor(Color.WHITE);// 刷屏 canvas.drawText("Himi", 100, 100, paint);// 画文字文本 canvas.drawText("这就是简单的一个游戏框架", 100, 130, paint); } catch (Exception ex) { } finally { // 备注3 if (canvas != null) sfh.unlockCanvasAndPost(canvas); // 将画好的画布提交 } } public void run() { while (true) { draw(); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } }
代码解释:
0) surfaceview初始化的时候,创建了一个thread。因为这个surfaceview 继承与runnable接口,所以this指针可以传给这个thread.
当这个thread开始运行时,它会从this.run ()开始运行。
1) surface创建的时候,会调用到surfaceCreated()。这个函数中调用了一个thread.start()。这样这个thread就运行在run()函数当中。
2)run函数调用draw()方法,绘制图形。