描述:1.利用SurfaceView来实现计时功能,同时不断将圆弧画满;2.点击按钮可以停止计时;
重点:
1.自定义SurfaceView中针对SurfaceHolder.CallBack的三个方法进行覆写;
2.通过surfaceHolder.lockCanvas()在新开的线程中得到canvas对象,从而进行图形和时间文字的绘制;
3.通过设置flag值,从而控制在线程run()方法中逻辑代码的执行;
重要部分代码:
public TestView(Context context) { super(context); surfaceHolder = getHolder(); surfaceHolder.addCallback(this); countThread = new CountThread(surfaceHolder); }public TestView(Context context, AttributeSet attributeSet) { super(context, attributeSet); surfaceHolder = getHolder(); surfaceHolder.addCallback(this); countThread = new CountThread(surfaceHolder); }以上为自定义的SurfaceView(TestView)的构造函数,做相应的初始化工作。(第二个构造方法在实现过程中没有覆写,导致如果是通过布局文件引入进Activity中时,则显示不出View——>也就是一般自定义View一定要覆写的构造方法)。
@Override public void run() { Canvas canvas = null; int pivotX = getResources().getDisplayMetrics().widthPixels / 2; RectF rectF = new RectF(pivotX - 300, pivotX - 300, pivotX + 300, pivotX + 300); while (!isStop) { try { canvas = surfaceHolder.lockCanvas(); canvas.drawColor(Color.WHITE);//设置画布背景为白色 //canvas.drawRoundRect(300, 300, 600, 600, 150, 150, paint);//直接使用该行代码来画圆是行不通的,因为这个方法要求版本21,我的手机运行android版本是19 canvas.drawArc(rectF, -90, endAngle++, false, paint);//-90在这里不等于270,所以要想从最上方开始画弧,就得用-90 canvas.drawText(countTime(endAngle), pivotX, pivotX, paintText);//显示计算的时间 Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } finally { if (canvas != null) {//需要对canvas进行非空判断 surfaceHolder.unlockCanvasAndPost(canvas); } } } }主要就是通过Thread.sleep(1000)来停顿一秒,从而通过endAngle来计数。
@Override public void surfaceCreated(SurfaceHolder holder) { if (!countThread.isAlive()) {//如果线程不存在,则启动线程——>当应用挂起的时候Thread是存在的,如果不做这个判断,会报“Thread already started ”错误 countThread.start();//SurfaceView创建时开启线程 } }在surfaceCreated()方法中对该线程是否是在存活中进行判断。