前言
之前看了《Android自定义组件开发详解》这本书,上面有一个例子就是讲的就是如何绘制一个时钟,研究了一下里面的原理,于是自己也写了一个,并且还加上了一些效果,算是一个升级版本的时钟吧。接下来主要就是讲解一下如何绘制一个自定义的时钟的。
还是先来看一下最后实现的效果吧:
显示阿拉伯数字,背景深绿色
显示希腊数字,背景黑色
自定义时钟绘制
创建好一个工程之后,我们需要创建一个类RuiWatchView,让这个类继承View,并实现View的三个构造方法
自定义View的时候,我们需要重写它的onDraw方法,在这个方法里面我们可以进行一系列的图形绘制操作
下面通过代码看一下分别在构造函数和onDraw方法里面分别执行了什么操作:
构造方法:
onDraw方法:
从上面的代码中可以看出来,构造方法里面主要是执行了一些初始化的操作,而在onDraw方法里面执行的就是具体的绘制步骤了,所有的绘制操作都是在这个方法里面完成的。下面我们分解一下每个过程,具体看看是怎么实现的。
绘制表盘
绘制表盘刻度
在onDraw方法中我们已经确定了时针的大小了,半径为len的一半
接下来我们就需要绘制一个圆形,作为一表盘的轮廓:
圆形轮廓画好之后,就需要在圆形上面绘制刻度了,一半时钟都是由60根刻度线组成的,其中每5根刻度线就有一根长的刻度线,表示整点小时,其他的刻度线长度稍短,每个刻度之间的角度为6度,这样所有的刻度正好组成一个360度的圆。所以可以通过一个for循环来实现:每绘制一条刻度线,就将图形旋转6度,然后再绘制刻度线,以此类推,直到所有刻度线全部绘制完成。
绘制表盘时间数字
表盘刻度线画好之后就应该绘制表盘上显示的数字了,数字应该显示从1点到12点,总共12个数字,同样可以使用for循环来实现:通过圆形半径、每个数字位置划过的角度大小,然后再通过计算半径的正弦值和余弦值就可以得出每个数字所在的位置坐标,再将数字绘制到对应的坐标点上去
绘制时针、分针和秒针
获取当前的时间
在构造方法中我们已经获取了一个Calendar的实例,在这里就可以通过这个实例来获取当前的的时间:
绘制时针
绘制时针的时候,首先我们要根据当前的时间来进行一个角度的计算,根据这个角度可以绘制出一条直线,代码如下:
下面的分针和秒针的绘制原理基本上与时针是一致的,就不一一赘敘了,贴上代码
绘制分针
|
|
绘制秒针
|
|
添加自定义设置
最后还为时钟设置了两个自定义属性,分别是表盘的背景颜色和表盘数字显示方式,这两个属性均可以通过xml文件设置或者通过java代码进行设置,下面我们来看一下如何自定义这两个属性:
第一步、在资源文件styles.xml中定义自己想要的一些属性,这里定义了custom_background和custom_display_type这两个属性
第二步、在布局文件中设置该属性
这里需要注意一点,使用自定义属性的时候,需要在根布局中定义一个属性
然后才能在xml文件中定义自己设置的属性
第三步、在自定义View的构造函数中获取这两个属性
设置表盘颜色
1、xml设置方式:
2、代码中设置
注意:在xml文件中可以随意定义颜色值,但是在java代码中进行设置的话,只是定义了四个简单的枚举类型:BLACK,GREEN_DARK,GREEN_LIGHT,BLUE
设置表盘数字格式
1、xml设置方式:
2、代码中设置
注意:这里的数字类型只定义了两种,Arabia(阿拉伯)、Greece(希腊)
调用方法
|
|
以上这句代码就是让绘制的时钟开始工作,具体的原理可以看下面的代码
其实就是利用Timer定时器,每隔一秒钟的时间重新进行一次时钟的绘制,还是很简单的。
如何在自己的项目中调用
1、在项目gradle.build中添加下列代码
2、在app的gradle.build中添加依赖
这样就可以在自己的项目中使用这个时钟控件了
总结
这样的话,一个自定义的时钟就绘制完成了,还是比较简单的,不过里面运用的知识点还是不少的,大家可以通过这个例子来进一步的深入学习一下自定义View