SurfaceView的操作类

来源:互联网 发布:mac版wifi破解软件 编辑:程序博客网 时间:2024/05/17 04:51


写一个类,继承SurfaceView,在其构造方法中,获取surfaceHolder,并得到SurfaceView的生命周期。在surfaceCreated方法里,开启绘制线程,在surfaceDestory方法里,关闭线程。在线程里,每隔50s绘制一次。绘制方法用try  catch方法包起来,因为可能canvas会报空指针,在进入主屏幕的时候,或者线程没有停止,但SurfaceView已经关闭的情况下。

下面是代码

package com.example.roundprogressbar;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;public class MySurfaceView extends SurfaceView implements Callback, Runnable {private SurfaceHolder mSurfaceHolder;private Canvas mcCanvas;/** * 绘制线程 */private Thread mThread;/** * 线程是否在执行 */private boolean isRunning;public MySurfaceView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MySurfaceView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);mSurfaceHolder = getHolder();mSurfaceHolder.addCallback(this);// 可获得焦点setFocusable(true);setFocusableInTouchMode(true);// 设置屏幕常亮setKeepScreenOn(true);}public MySurfaceView(Context context) {this(context, null, 0);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// 在这里开启线程isRunning = true;mThread = new Thread(this);mThread.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {isRunning = false;}@Overridepublic void run() {while (isRunning) {//每隔50ms绘制一次long startTime=System.currentTimeMillis();draw();long endTime=System.currentTimeMillis();if(endTime-startTime<50){try {Thread.sleep(50-(endTime-startTime));} catch (InterruptedException e) {e.printStackTrace();}}}}private void draw() {try {mcCanvas = mSurfaceHolder.lockCanvas();if (mcCanvas != null) {// 在这里进行绘制操作}} catch (Exception e) {e.printStackTrace();} finally {if (mcCanvas != null) {mSurfaceHolder.unlockCanvasAndPost(mcCanvas);}}}}


1 0
原创粉丝点击