背景:在跑步过程中,由于频繁定位,来获取实时的经纬度信息,并计算当前用时和移动距离,由此得出实时配速。
这样会有以下问题:
1、有可能每个点的配速不同,而且点数非常多,出来的效果就是这样的
可以看到,颜色分明很多,不那么的平滑。这是由于5秒获取一个经纬度,同时该点上的实时配速都有可能不一样,会有上下的波动,而颜色的值是跟速度的快慢相关的,例如:speed<4'00''就是快的,显示绿色;speed>9'00''就是慢的,显示红色;我们的颜色区间可以稍微大一点,在speed 2'00'' 到 18'00''之间,就是最快速度和最慢速度。
在android 中,颜色从红色到黄色、再到绿色 是有规律的,如下:
红色:Color.argb(255, 255, 0, 0)
黄色:Color.argb(255, 255, 255, 0)
绿色色:Color.argb(255, 0, 255, 0)
这样子就有了颜色渐变方法。如果当前点 speed小于 2'00'' 则默认绿色, speed大于 18'00'' 则默认红色即可
// 颜色的渐变,应该把分别获取对应的三基色,然后分别进行求差值;这样颜色渐变效果最佳
return when {
radio > defaultSp -> {
val c = min(255 - (radio - defaultSp) / 2 * 255,255.0)
Color.argb(255, 255, c.toInt(), 0)
}
radio < defaultSp -> {
val c = min( 255 - (defaultSp - radio) / 2 * 255,255.0)
Color.argb(255, c.toInt(), 255, 0)
}
else -> {
Color.argb(255, 255, 255, 0)
}
}
2、速度平均处理
从上面颜色的设置,解决了展示具体配速的效果,但是点数还是那么多,需要抽稀,例如100个点,每个点都有一个速度值speed,这时候需要100个点抽稀成50个相同速度,甚至20个相同速度。
把100个点列成数组,以10个点为一组,取这10个点的平均值,再生成一个100个点的数组,这个新的数组就是抽稀算法后的值,它只有10个不同的速度speed。
那么处理之后的效果如下: