开始正式介绍实现过程之前,先来看下效果图,原点纵向跳动,跳动幅度在上次原点数的基础上随机做增减。
1. 产品需求
编号 | 需求描述 |
---|---|
1 | 纵向的原点大小从下至上逐级递减 |
2 | 纵向原点的跳动幅度在上次圆点数的基础上进行随机增减 |
3 | 跳动频率可控 |
4 | 原点与原点之间的间隙可控 |
5 | 纵向圆点数可控 |
6 | 圆点颜色值可控 |
7 | 圆点最大半径、最小半径可控 |
2. 实现思路
实现的思路可以解构成下面的示意图,将控件等分为宽高一致的小方块,最下的方块中绘制最大圆点,最上面的方块绘制最小圆点,圆点的直径小于方块宽度,圆点之间的间隙就可以空出来了。如果以列为绘制单位,从左至右逐列绘制该列上每个方块中的圆点。绘制列上的圆点时,再根据圆点所在方块的位置确定圆点半径,从下至上进行绘制。至此,一幅静态的音频图已经绘制完成,如果想让这些圆点跳动起来,可以增加一个驱动的引擎,每隔一段时间去调用重绘方法即可。
绘制的时候,需要注意一下默认的坐标系。控件的左上角是坐标原点(0,0),原点右边是 X 轴正方向,原点下面是 Y 轴正方向;右侧的边缘是控件的宽度,下侧的边缘是控件的高度。
3. 绘制控件
定义一个控件 RackVew 继承自 ViewGroup 子类,重写 onSizeChanged 和 onDraw 方法。这里为了将代码分层,引入一个 RockViewHelper 帮助类,onSizeChanged 和 onDraw 方法中的复杂操作交由 RockViewHelper 接管,RackVew 对用户开放启动和停止动画的方法。RockViewHelper 在 RackVew 的构造方法中完成初始化。
1 | package com.sunzn.rock.library; |
RockViewHelper 实现如下,在 RockViewHelper 的构造方法中完成 Paint 和各种参数的初始化,在 onSizeChanged 中完成尺寸和每列上圆点数的计算,在 onDraw 中逐列进行绘制。
1 | package com.sunzn.rock.library; |
4. 项目地址
项目地址:RockView @ Github