Android开发--SurfaceView的基本用法
来源:互联网 发布:销售管理数据流程图 编辑:程序博客网 时间:2024/05/16 13:00
在Android中可以利用View来绘制一些图形,图片,但当我们开发游戏或视频时,View就不再适用,这时必须使用SurfaceView来代替View。SurfaceView相比View可以实现多线程绘图和双缓冲技术,可以使得我们的动画更加流畅。接下来简单记录一下Surface的基本用法:
首先我们应该继承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() {@Overridepublic void run() {// TODO Auto-generated method stubwhile (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
@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubisLived = true;myThread.start();Log.w(TAG, "surfaceCreated");}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubisLived = 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 implementsSurfaceHolder.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() {@Overridepublic void run() {// TODO Auto-generated method stubwhile (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 stubinit();}public MySurfaceView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinit();}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);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubisLived = true;myThread.start();Log.w(TAG, "surfaceCreated");}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubisLived = false;Log.w(TAG, "surfaceDestroyed");}}
0 0
- Android开发--SurfaceView的基本用法
- Android SurfaceView的基本用法
- Android开发:SurfaceView基本用法总结
- Android开发:SurfaceView基本用法总结及开发问题分享
- Android SurfaceView 的基本应用
- Android SurfaceView 的基本应用
- android的surfaceview的用法
- surfaceView基本用法
- Android之SurfaceView的基本使用
- android开发-广播的基本用法
- android开发之pinyin4j的基本用法
- Android开发初识Volley的基本用法
- Android开发笔记:Button的基本用法
- Android开发之PathMeasure的基本用法
- android中SurfaceView用法
- Android SurfaceView用法
- SurfaceView的基本用法模板自定义实现抽奖盘
- SurfaceView的基本使用
- 无题
- iOS 集移动,旋转,缩放于一体的函数:CGAffineTransformMake(a,b,c,d,tx,ty)
- 百度的Js日历,值得一看
- HBase0.98.8 YCSB测试环境搭建
- python mongo
- Android开发--SurfaceView的基本用法
- Windows下搭建IOS开发环境(一)
- Installing and Using Ranger
- 调用Openssl中的SHA1库
- hdu1299 枚举因子
- Android之进程管理
- BackBone 学习笔记 05 库函数Objects类
- Hadoop-2.5.2集群安装配置笔记
- 50款拥有超赞用户体验的精美移动UI设计