本文由chuw1投稿。
chuw1的博客 1效果图
录制的可能略卡,三次时间图片是因为我分别点了下面三个按钮的效果,并非bug.
2分析观看上图咱们需要绘制的有:
时针
分针
秒针
时刻度
秒刻度
仪表盘上的数字
上下午区分标识(AM/PM)
Viw与Surfac的取舍:
Viw一般用于绘制静态页面或者界面元素跟随用户的操作(点击、拖拽等)而被动的改变位置、大小等
SurfacViw一般用于无需用户操作,界面元素就需要不断的刷新的情况(例如打飞机游戏不断移动的背景)
通过以上两条可以确定SurfacViw正好符合我们的需求
SurfacViw注意事项如何使用SurfacViw
surfacCratd:Surfac创建后调用,一般做一些初始化工作
surfacChangd:Surfac状态发生变化时调用(例如大小)
surfacDstroyd:Surfac销毁时调用,一般在这里结束绘制线程
1.继承SurfacViw
2.实现SurfacHoldr.Callback接口
.SurfacHoldr:控制Surfac的类,得到画布、提交画布、回调等
4.绘制和逻辑
SurfacViw的写法
这是一般性写法,不过有些人应该已经发现了我们线程里跑的是一个whil(tru)的无限死循化,因此往往我们会增加一个标识位在surfac销毁时置fals。修改后部分代码如下:
当然了这样还是有缺陷的,因为当flag==tru时,mThrad里面的逻辑操作和绘制操作就在无限运行了。可想而知,如果是那样的话那么我们这里的时钟指针在你眼前飞速的转动,由于gif录制工具不够强大录下的动图根本开不出指针飞速旋转的效果这里就不提供图了,有兴趣的同学可以自己试一下,也可以脑补。。。。。。。。。。。
因此我们就需要对线程加以限制,具体如下:
这里的指的是每隔1S刷新一次界面,因为我们的始终的最小单位是秒
4实战stp1:通过2的分析,定义需要的属性
stp2:初始化操作
stp:测量
测量的前面部分代码基本都是一个模式来写的,需要注意的是当测量模式不是Exctly时的处理,想要了解这一块同学的可以去鸿洋的博客学习
stp4:绘制
现在开始具体的绘制内容(画什么由画布决定,怎么画由画笔决定,这也就是我们上面给画笔设置一系列属性的原因):
这里比较难的可能就是指针的绘制,因为我们的指针是个规则形状,其中gtPointrCoordinats便是得到这个不规则形状的个定点坐标,有兴趣的同学可以去研究一下我的逻辑,也可以定义你自己的逻辑。我的逻辑如下(三角函数学的号的同学应该一眼就能看懂):
stp5:逻辑
这里逻辑可想而知每个秒,秒数+1到60的时候归0,同时分钟数+1,分钟数到60的时候归0,小时数+1,小时数到24的时候归0.
stp6:装逼的时刻到了
运行来看一下效果
我靠什么情况为什么画出来是这么个东西
这里就是要值得大家注意的了,使用surfac绘制的时候一定要刷屏,所谓的刷屏在每次绘制前画一个什么都没有图层在上次画出来的东西上面盖住再去画本次实现也很简单只需要在绘制的第一行加上一句就行。我这里是:
//刷屏mCanvas.drawColor(Color.WHITE);
这里的背景也可以通过自定义属性来自定义的。不知道的同学仍然可以去鸿神的博客学习.
5总结主要涉及知识点:
Viw和SurfacViw的取舍
SurfacViw的使用
Canvas使用
坐标系的灵活运用
图上的点击按钮改变时间和改变txtViw上的时候只是定义了一个回调接口,这里不再赘述.源码下载: