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作图的基本方法。
http://developer.android.com/guide/topics/graphics/2d-graphics.html#draw-with-canvas
 
 
 
 
下面两篇文章给出了实例,如何在canvas上,利用custom view作图
 
http://blog.sina.com.cn/s/blog_61ef49250100qw9x.html
http://www.cnblogs.com/stulife/archive/2010/08/19/1803313.html
 
 
下面的代码实例中,显示了如何利用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()方法,绘制图形。

 

  

 
 
 
 
posted on 2013-08-26 18:36  keniee  阅读(468)  评论(0编辑  收藏  举报