码迷,mamicode.com
首页 > 其他好文 > 详细

View 和 SurfaceView的区别

时间:2014-07-25 11:38:57      阅读:484      评论:0      收藏:0      [点我收藏+]

标签:des   java   color   使用   os   数据   io   width   

这里说的是在绘图中两者的区别:

1View在绘图中,重写onDraw(Canvas canvas)方法,通过invaldate()和pastInvalidate()两个方法进行重新绘制画布;

invalidate()不能再自己创建的线程中循环调用;

postInvalidate()可以在自己创建的线程中循环调用执行。如果不在当前View 创建线程循环重绘画布的话,这两种重绘画布的函数就没什么区别了,都可以用。

public class MyView extends View {

	private float x;
	private float y;
	public MyView(Context context) {
		super(context);
	}

	
	//需要绘制图像时调用
	@Override
	protected void onDraw(Canvas canvas) {
		Paint mPaint = new Paint();
		mPaint.setColor(Color.BLUE);
		canvas.drawLine(0, 0, x, y, mPaint);
		super.onDraw(canvas);
		
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		x = event.getX();
		y = event.getY();
		//重绘画布
		invalidate();
//		postInvalidate();
		return true;
		
	}
}

2,surfaceView继承自view

在使用surfaceView时,你会发现复写父类的onDraw(Canvas canvas)方法并不会执行。原因是在SurfaceView中,我们并不会直接跟他打交道,而是通过SurfaceHolder来控制。使用SurfaceHolder的lockCanvas()函数来获取到SurfaceView的Canvas对象,再通过Canvas上绘制内容来修改SurfaceView中的数据

public class MySurfaceView extends SurfaceView implements Callback, Runnable {

	private SurfaceHolder sfh;
	private Paint paint;
	private Canvas canvas;

	private Thread th;
	private boolean flag;
	private int textX;
	private int textY;

	public MySurfaceView(Context context) {
		super(context);
		sfh = this.getHolder();
		sfh.addCallback(this);
		paint = new Paint();
		paint.setColor(Color.WHITE);
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		flag = true;
		th = new Thread(this);
		th.start();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		flag = false;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		textX = (int) event.getX();
		textY = (int) event.getY();
		return true;
	}

	public void myDraw() {
		// 获取一个加锁的画布,为了防止surfaceview在绘制过程中被修改,销毁等状况
		Paint blackPaint = new Paint();
		blackPaint.setColor(Color.BLACK);
		
		try {
			canvas = sfh.lockCanvas();
			if (canvas != null) {
				canvas.drawRect(0, 0, getWidth(), getHeight(), blackPaint);// 刷屏1
//			canvas.drawColor(Color.BLACK);//刷屏2
//			canvas.drawRGB(0, 0, 0);//刷屏3
				canvas.drawText("game", textX, textY, paint);

			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if (canvas != null) {
				// 解锁画布和提交
				sfh.unlockCanvasAndPost(canvas);
			}
			
		}

	}

	/**
	 * 游戏逻辑
	 */
	private void logic() {

	}

	@Override
	public void run() {
		while (flag) {
			long start = System.currentTimeMillis();
			myDraw();
			logic();
			long end = System.currentTimeMillis();
			try {
				if (end - start < 50) {
					Thread.sleep(50 - (end - start));
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

他们两个更新画布的区别:

在View视图中对于画布的重新绘制,是通过调用View 提供的postInvalidate()与inValidate()这两个函数来执行的,也就是说画布是由系统主UI进行更新。那么当系统主UI线程被绘制函数阻塞,这样一来则会引发无法响应按键,触屏等消息的问题;

SurfaceView视图中对于画布的重绘是由一个新的单独线程去执行处理,所以不会出现因主UI线程阻塞而导致无法响应按键,触屏信息等问题。


surfaceview 有双缓冲机制,而view 没有




View 和 SurfaceView的区别,布布扣,bubuko.com

View 和 SurfaceView的区别

标签:des   java   color   使用   os   数据   io   width   

原文地址:http://my.oschina.net/u/936286/blog/294768

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!