SurfaceView的操作类
2015-11-16 15:08
239 查看
写一个类,继承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); } } } }
相关文章推荐
- 数据链路的创建(oracle数据库与oracle数据库)
- 35个jQuery小技巧(转)
- Android 自定义View
- 微信支付-“申请退款”接口遇到curl出错,错误码:58
- ReaderWriterLockSlim 类
- 一个ListView中显示不同的item(分组)
- java进阶学习笔记
- ioctl幻数
- Apache
- 自定义圆形图片
- Java基础编程之分解质因数
- 【资源】我的图片
- 【HDU5556 2015合肥赛区E】【最大团or二分图匹配】Land of Farms 不同编号不相邻条件下的最大农场数
- iOS LBS相关: 定位和中国特色的位置偏移纠正
- 排序算法之交换排序——冒泡排序
- js设置、获取单值cookie和多值cookie
- 开发人员---沟通的重要性
- Cloud Design Pattern - Runtime Reconfiguration Pattern(运行时配置)
- ftp上传图片
- java调用c++