Android之SurfaceView学习一

时间:2022-04-27
本文章向大家介绍Android之SurfaceView学习一,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

实例代码:

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new MyView(this));
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	/**
	 * surfaceview的实例,用来处理贴图问题
	 */
	class MyView extends SurfaceView implements SurfaceHolder.Callback {

		private SurfaceHolder holder;
		private MyThread myThread; // 处理绘图的线程

		public MyView(Context context) {
			super(context);
			// TODO Auto-generated constructor stub
			holder = this.getHolder(); // 获得SurfaceHodler对象
			holder.addCallback(this); // 添加回调方法
			myThread = new MyThread(holder); // 创建处理绘图的线程
		}

		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {
			// TODO Auto-generated method stub

		}

		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			// TODO Auto-generated method stub
			myThread.isRun = true;
			myThread.start();
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			// TODO Auto-generated method stub
			myThread.isRun = false;
		}

	}

	public class MyThread extends Thread {
		public boolean isRun;
		private SurfaceHolder holder;

		public MyThread(SurfaceHolder holder) {
			this.holder = holder;
			isRun = true;
		}

		@Override
		public void run() {
			int count = 0;
			while (isRun) {
				Canvas c = null;
				try {
					synchronized (holder) {
						c = holder.lockCanvas();
						c.save();	// 保存当前绘图环境
						c.drawColor(Color.BLACK); // 设置画布背景黑色
						Paint p = new Paint(); // 创建画壁
						p.setColor(Color.WHITE);
						Rect r = new Rect(100, 50, 300, 250);
						c.drawRect(r, p);
						c.drawText("This is the " + (count++) + " seconds",
								100, 310, p);
						
						c.restore(); // 恢复先前绘图环境
						Thread.sleep(1000); // sleep 1 second
					}
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					if(c!= null){
						holder.unlockCanvasAndPost(c); // 结束锁定画布,并提交改变
					}
				}
			}
		}
	}

}

上面的代码从整体的使用方面给出了实例,接下来进行逐步分解。

1. 首先是声明一个继承SurfaceView并且实现SurfaceHolder.CallBack的子类

class MyView extends SurfaceView implements SurfaceHolder.Callback {
                  @Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {
			// TODO Auto-generated method stub

		}

		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			// TODO Auto-generated method stub
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			// TODO Auto-generated method stub
		}

2. 在子类中获得一个用于控制suerfce对象的surfaceHolder对象

holder = SurfaceView.getHodler();
holder.addCallback()

3. 在surfaceCreated方法中调用处理绘图线程,并将holder对象传递给绘图线程

4. 绘图线程中处理步骤:

//首先获得canvas对象
Canvas c = holder.lockCanvas();
c.store();
...
...
//解锁并提交改变
c.restore();
holder.unlockCanvasAndPost(c);