Android开发--SurfaceView的基本用法
2014-12-16 12:12
453 查看
在Android中可以利用View来绘制一些图形,图片,但当我们开发游戏或视频时,View就不再适用,这时必须使用SurfaceView来代替View。SurfaceView相比View可以实现多线程绘图和双缓冲技术,可以使得我们的动画更加流畅。接下来简单记录一下Surface的基本用法:
首先我们应该继承SurfaceView的类,并实现SurfaceHolder.Callback,这个接口是用来管理SurfaceView的生命周期,一共有三个方法:
1)surfaceCreated: SurfaceView对象被创建时触发;
2)surfaceChanged: SurfaceView的大小发生变化时触发;
3)surfaceDestroyed: SurfaceView对象被销毁时触发;
我们在初始化方法中得到SurfaceHolder的对象,并通过该对象的addCallback方法添加这个接口进来
然后我们在Callback接口方法中在create方法中设置标志isLived为true,然后开启线程,在destory方法中设置isLived为false
首先我们应该继承SurfaceView的类,并实现SurfaceHolder.Callback,这个接口是用来管理SurfaceView的生命周期,一共有三个方法:
1)surfaceCreated: SurfaceView对象被创建时触发;
2)surfaceChanged: SurfaceView的大小发生变化时触发;
3)surfaceDestroyed: SurfaceView对象被销毁时触发;
我们在初始化方法中得到SurfaceHolder的对象,并通过该对象的addCallback方法添加这个接口进来
private void init() { holder = getHolder(); holder.addCallback(this); paint = new Paint(); paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.STROKE); }接下来创建我们的异步线程来进行绘图操作
private Thread myThread = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (isLived) { if (num <= 20) { num++; } else { num = 2; } canvas = holder.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK);//清屏 canvas.drawCircle(100, 100, num, paint); holder.unlockCanvasAndPost(canvas); } try { Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception } } } });通过lockCanvas方法我们可以得到一个加锁的Canvas,当Canvas在进行绘图时,或被锁起来。注:如果当前Canvas正在被绘制,将会返回一个null值。接下来我们绘制一个空心的圆,半径不断增加。绘制完成后将锁打开。
然后我们在Callback接口方法中在create方法中设置标志isLived为true,然后开启线程,在destory方法中设置isLived为false
@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 isLived = true; myThread.start(); Log.w(TAG, "surfaceCreated"); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub isLived = false; Log.w(TAG, "surfaceDestroyed"); }附上整个类的源码
package com.example.test; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG = "MySurfaceView"; private SurfaceHolder holder; private boolean isLived; private Paint paint; private Canvas canvas; private int num; private Thread myThread = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (isLived) { if (num <= 20) { num++; } else { num = 2; } canvas = holder.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); canvas.drawCircle(100, 100, num, paint); holder.unlockCanvasAndPost(canvas); } try { Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception } } } }); public MySurfaceView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub init(); } public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(); } public MySurfaceView(Context context) { super(context); init(); // TODO Auto-generated constructor stub } private void init() { holder = getHolder(); holder.addCallback(this); paint = new Paint(); paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.STROKE); } @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 isLived = true; myThread.start(); Log.w(TAG, "surfaceCreated"); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub isLived = false; Log.w(TAG, "surfaceDestroyed"); } }
相关文章推荐
- Android开发:SurfaceView基本用法总结及开发问题分享
- Android开发:SurfaceView基本用法总结
- Android提高之SurfaceView的基本用法实例分析
- Android SurfaceView的基本用法
- 【Android游戏开发十九】(必看篇)SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理!
- 【Android游戏开发之二】剖析游戏开发用view还是surfaceView ?!
- Android游戏开发之SurfaceView动画
- 【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!
- Android开发中的游戏开发使用View还是SurfaceView?
- 【Android2D游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
- 【Android游戏开发之二】剖析游戏开发用view还是surfaceView ?!
- 【Android游戏开发十九】(必看篇)SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理!
- 【Android游戏开发之三】剖析 SurfaceView ! Callback以及SurfaceHolder!!
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- 【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!
- 【Android游戏开发之三】剖析 SurfaceView ! Callback以及SurfaceHolder!!
- 【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!
- 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!