自定义控件之饼状图
绘制饼状图分析
- 定义一个起始角度
- 计算每块扇形的弧度
- 遍历数据,每一个起始角度,是上一个扇形的结束角度
- 扇形的外接矩形的左上右下不需要计算,移动坐标系到屏幕中间
绘制直线
直线的两个要素:
- 直线的起点,这里是每块扇形的弧的中心点
- 直线的终点,这里是连接圆心和起点的延长线上某个点
起点的计算:
- 获取对应扇形的弧度
- 扇形起始角度+弧度/2
- 半径*角度结果的余弦值,横坐标纵坐标同理
终点的计算:起点计算的第三步将半径增大即可
|
|
判断点击位置所在的扇形区域
将点击的坐标位置转化为以饼状图中心为原点的坐标,对坐标进行处理,将坐标转化为点击的角度,判断是否处于某一个饼状图所在的角度区域
|
|
处理触摸事件
|
|
定义基本信息载体,即javabean
|
|
初始化三个画笔
|
|
计算绘制饼状图的外接矩形的左上右下距离
|
|
绘制饼状图
|
|
Math
Math类提供了常用的一些数学函数,如:三角函数、对数、指数等。一个数学公式如果想用代码表示,则可以将其拆分然后套用Math类下的方法即可。
方法 | 功能描述 |
---|---|
atan(y/x) | 返回正数值表示相对于 x 轴的逆时针转角,返回负数值则表示顺时针转角 |
toDegrees() | 角度转换成弧度 |
toRadians() | 弧度转换成角度 |
cos() | 余弦值 |
sin() | 正弦值 |
tan() | 正切 |
sqrt() | 开平方 |
min() | 最小值 |
max() | 最大值 |
abs() | 绝对值 |
pow(x,y) | x的y次幂 |
floor() | 向下取整 |
ceil() | 向上取整 |
hypot(x, y) | x和y平方和的二次方根 |
random() | 随机返回[0,1)之间的无符号double值 |
rint() | 返回最接近这个数的整数,如果刚好居中,则取偶数 |
round() | 与rint相似,返回值为long |
|
|
角度与弧度
角的度量单位通常有两种,一种是角度制,另一种就是弧度制。
角度制,就是用角的大小来度量角的大小的方法。在角度制中,我们把周角的1/360看作1度,那么,半周就是180度,一周就是360度。由于1度的大小不因为圆的大小而改变,所以角度大小是一个与圆的半径无关的量。
弧度制,顾名思义,就是用弧的长度来度量角的大小的方法。单位弧度定义为圆周上长度等于半径的圆弧与圆心构成的角。由于圆弧长短与圆半径之比,不因为圆的大小而改变,所以弧度数也是一个与圆的半径无关的量。角度以弧度给出时,通常不写弧度单位,有时记为rad或R。
根据弧度的定义,以长为圆周长(2πr)的弧所对的圆心角为2π 弧度,半个圆周长的弧所对的圆心角为π 弧度。
于是,角度与弧度间换算关系就十分明了了。因为360度=2π,所以,1度=π/180≈0.01745弧度,1弧度=180/π≈57.3度。