前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android之SurfaceView学习一

Android之SurfaceView学习一

作者头像
一灰灰blog
发布2018-02-06 11:56:07
6030
发布2018-02-06 11:56:07
举报
文章被收录于专栏:小灰灰小灰灰

实例代码:

代码语言:javascript
复制
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的子类

代码语言:javascript
复制
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对象

代码语言:javascript
复制
holder = SurfaceView.getHodler();
holder.addCallback()

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

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

代码语言:javascript
复制
//首先获得canvas对象
Canvas c = holder.lockCanvas();
c.store();
...
...
//解锁并提交改变
c.restore();
holder.unlockCanvasAndPost(c);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档