SurfaceView的使用

首先说一下SurfaceView的特点:

可以在主线程之外的线程中向屏幕上绘图。

主要是用于游戏、动画及一些需要频繁绘制图像的视图中。

SurfaceView有两个Surface,一个是主线程的Surface,一个是自己特有的Surface


SurfaceView该如何使用:

第一步先创建一个类继承SurfaceView

第二步通过getHolder获取管理surface的SurfaceHolde的对象

第三步实现Callback接口,通过该对象调用addCallback(回调函数)

第四步实现Callback接口需要重写三个方法

第五步通过SurfaceHolde的对象调用lockCanvas()获取画布

第六步画完后调用unlockCanvasAndPost(canvas)将画布返回给主线程


具体代码如下:

// 1.继承SurfaceView
public class GameView extends SurfaceView implements Callback, Runnable {


	int postion;
	Paint paint;
	Bitmap bg/* 背景 */, map/* 路径 */;
	Bitmap turreti;// 道具的按键
	Bitmap[] turretis = new Bitmap[2];
	// SurfaceHolder对Surface进行管理
	SurfaceHolder sh;


	public GameView(Context context) {
		super(context);
		// 2.获取可以管理可以在子线程中绘制图像的Surface的SurfaceHolder的对象
		sh = getHolder();
		// 3.sh调用callBack方法(回调函数),才能知道管理的对象,即知道要联系的suface对象。
		sh.addCallback(this);// 添加回调函数,就会调用surfaceCreated()方法
	}


	// Callback(SurfaceHolder的内部接口)接口重写的三个方法
	/**
	 * 建立与surface的连接 .在此方法中,新建子线程.
	 * 哪个SurfaceHolder调用回调函数,该方法参数的对象就是该SurfaceHolder
	 */
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		Thread thread = new Thread(this);
		thread.start();
		paint = new Paint();
		paint.setColor(Color.BLUE);
	}


	/**
	 * 当surface大小改变的时候调用此方法
	 */
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
	}


	/**
	 * 当界面退出时(消亡)调用此方法 将子线程停止,一般子线程写在循环中,循环结束停止子线程。
	 */
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {


	}


	Canvas canvas;


	/**
	 * 绘制图像。所有绘制图像的方法都在此进行操作
	 */
	public void draw() {
		// sh.lockCanvas(dirty)//只选取一个矩形部分画图
		canvas = sh.lockCanvas();// 即获取画布对象
		// 有可能子线程做到一半主线程结束了,就锁不住画布。所以要进行判断
		if (canvas != null) {
			if (postion == 0) {
				canvas.drawRect(10, 10, 100, 100, paint);
			} else if (postion == 1) {
				canvas.drawCircle(100, 100, 100, paint);
			} else if (postion == 2) {
				canvas.drawLine(10, 10, 100, 100, paint);
			}
			// 将画完的内容传递给主线程,才能程序在界面中
			sh.unlockCanvasAndPost(canvas);
		}
	}


	@Override
	public void run() {


		while (postion < 3) {
			try {
				draw();
				Thread.sleep(1000);
				postion++;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}



 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值