SurfaceView的操作类


写一个类,继承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);
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// 在这里开启线程
		isRunning = true;
		mThread = new Thread(this);
		mThread.start();
	}

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

	}

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

	@Override
	public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值