今天在无意间翻看半年多前做的项目的时候,除了对自己当时写的渣代码的无尽嫌弃,更多是感叹当时在遇到困难时的种种不易,印象比较深刻的是在做重邮约跑的时候视觉要求做一个跑步时轨迹动态渐变的功能,并且采用均匀渐变,当时翻看高德SDK时候并没有发现相应的API,所以也是一脸懵逼,只能从颜色渐变的原理入手,逐步自己写一个工具类来实现了。
效果图如下:

虽然现在来看实现起来很简单,但还是把过程记录下来吧。

1.RGB的基本概念

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色。
要想操作渐变轨迹,就只需操作RGB三种颜色的色值就行了。

2.渐变的公式

既然渐变有公式,那么大部分问题就迎刃而解了。

假设某个通道的色值从startColor渐变到endColor,渐变距离的总距离为totalDistance,每隔 i 距离计算一次渐变的色值,则渐变公式为:

gradient = endColor +(startColor - endColor)* i /totalDistance

那么,思路就很清晰了,每次返回经纬度的时候,就绘制一点轨迹,并利用公式计算出当前轨迹的色值,即可实现渐变的轨迹。
但是,问题又来了,在跑步的时候如何能够确定跑步的总距离?当然是没办法确定的,所以当时我想到了两种方案:
第一:多数学生跑步的距离不会超过20km,就强行把totalDistance设置成20km。
第二:将渐变颜色的距离设得稍微短一点,如500米,然后采用“startColor -> endColor -> startColor -> endColor -> …”这种交替渐变的方案,实现渐变过渡。
最终综合了实际显示效果的因素,我方案二。

3.具体实现

具体实现比较简单,只需要每次动态调用GradientHelper#getGradient,便可动态确定当前位置的颜色值。

import android.graphics.Color;
import android.util.Log;import java.util.ArrayList;/*** Created by xushuzhan on 2017/3/15.*/public class GradientHelper {private static final String TAG = "GradientHelper";public int i= -1;public List<RGB> gradient=new ArrayList<>();int totalDistance;//渐变的范围int startColor;//渐变的起始颜色int endColor;//渐变的结束颜色public GradientHelper(int totalDistance, int startColor, int endColor) {this.totalDistance = totalDistance;this.startColor = startColor;this.endColor = endColor;}/*** 获取当前渐变颜色* @return 当前颜色的RGB值*/public int getGradient() {i++;int gradient_R ;int gradient_G ;int gradient_B ;int delta_R = Color.red(startColor) - Color.red(endColor);int delta_G = Color.green(startColor) - Color.green(endColor);int delta_B = Color.blue(startColor) - Color.blue(endColor);if (i <= totalDistance) {gradient_R = Color.red(endColor) + delta_R * i / totalDistance;gradient_G = Color.green(endColor)  + delta_G * i / totalDistance;gradient_B = Color.blue(endColor)  + delta_B * i / totalDistance;gradient.add(new RGB(gradient_R,gradient_G,gradient_B));} else if (i <= totalDistance*2 +1) {RGB rgb_1 = gradient.get(gradient.size() - i % (totalDistance + 1) -1);gradient_R = rgb_1.gradient_R;gradient_G = rgb_1.gradient_G;gradient_B = rgb_1.gradient_B;} else {RGB rgb_2 = gradient.get(0);gradient_R = rgb_2.gradient_R;gradient_G = rgb_2.gradient_R;gradient_B = rgb_2.gradient_R;gradient.clear();i = -1;}return Color.argb(255,gradient_R,gradient_G,gradient_B);}class RGB{int gradient_R ;int gradient_G ;int gradient_B ;public RGB(int gradient_R, int gradient_G, int gradient_B) {this.gradient_R = gradient_R;this.gradient_G = gradient_G;this.gradient_B = gradient_B;}}}

将过程色彩全部计算并储存在集合gradient中,调用时只需要在包含RGB三个值的集合里面来回读取即可。
调用的时候:

int distance = 1000;//1000米
int startColor = Color.argb(255, 135, 81, 168);
int endColor = Color.argb(255, 246, 100, 135);
GradientHelper gradientHelper = new GradientHelper(distance,startColor,endColor);for (int j = 0; j < distance; j++) {//当前颜色颜色的RGB值int colorRGB = gradientHelper.getGradient();
}

使用高德地图的SDK的时候像如下方法这样使用,即可在跑步时实现动态显示渐变轨迹。

    //实例化渐变帮助类GradientHelper mGradientHelper = new GradientHelper(500, Config.startColor, Config.endColor)@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (mListener != null && aMapLocation != null) {mListener.onLocationChanged(aMapLocation);// 显示系统小蓝点//当前的经纬度LatLng newLatLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());if (aMapLocation.getAccuracy() <= 30f && aMapLocation.getAccuracy() > 0) {//判断是否为第一次定位经纬度if (isFirstRecord) {mAMap.moveCamera(CameraUpdateFactory.zoomTo(18));  //设置缩放级别oldLatLng = newLatLng;isFirstRecord = false;//开始定位的时间,之后会放在开始跑步的方法里} else if (mPathRecord == null) {oldLatLng = newLatLng;mPathRecord = new PathRecord();mPathRecord.setBeginTime(Utils.getTimestamp());} else if (!Utils.isLatLngEqual(oldLatLng, newLatLng)) { //如果位置有移动PolylineOptions polylineOptions = new PolylineOptions();polylineOptions.width(15);//设置渐变颜色polylineOptions.color(mGradientHelper.getGradient());polylineOptions.add(oldLatLng, newLatLng);oldLatLng = newLatLng;mAMap.addPolyline(polylineOptions);//当前跑的距离mDistance = Utils.getDistanceByLatLng(mPathRecord.getRunningLatLng());}}}}

基于高德SDK实现跑步时轨迹渐变功能相关推荐

  1. Android基于高德SDK的开发——自定义地图主题样式(悬浮按钮+底部弹窗)

    日常的地图使用中,平台一般只会给我们提供地图的标准样式,造成了一定程度上的审美疲劳,那么如何实现地图的自定义样式呢?本文使用Android Studio 4.1,给开发者提供了一个基于高德地图SDK进 ...

  2. 基于高德sdk实现摩拜单车主界面,滑动地图获取地址信息

    共享单车可以说是2016年至今,一个火的不要不要的项目,简单的界面,实用的功能.观察摩拜单车,ofo单车等几个项目会发现,基本上大同小异,项目的思路跟滴滴打车项目大同小异,都是基于Gps定位,实现查找 ...

  3. 基于高德地图实现融云位置共享功能

    基于高德地图实现融云位置共享功能(Android篇) 效果预览: 开发准备: 1: 登录 融云开发者账号,提交 server 平台工单申请开通 实时位置共享功能.工单回复开通成功后. 2 小时生效. ...

  4. (已开源)基于高德SDK 、Api,实现纯H5的精准坐标选址工具

    背景 由于第一版是基于端上 Windvane 做的跨页面选址工具,社区内有不少同学希望做个支持纯H5的版本 这也是我在一期时候的待完善计划之一 一期:基于 高德 + Windvane 的选址工具,对高 ...

  5. 基于高德地图实现可编辑的电子围栏功能【多边形围栏】

    上次基于高德地图实现了圆形围栏功能,但限于实地使用场景,故近期重新升级到多边形电子围栏,经过反复测验及优化,目前可正常使用. 1.主要功能: 多边形围栏的CURD: 自定义变数,形状: 自动计算变数及 ...

  6. 基于高德地图实现的公交线路查询功能

    高德地图支持公交线程查询功能.线上示例; 线上示例说明 接口返回的数据结构: path和via_stops字段详情: ... path: [{Q: 39.97741, R: 116.397880999 ...

  7. 基于高德地图SDK实现跑步路线踩点

    前言   现在市面上有很多跑步的app,主要的功能大致是记录你的跑步路线以及你的跑步状况,速度距离等,大多是使用了高德地图,百度地图之类的SDK.   之前学校里有一款课外体育考勤的跑步APP,叫运动 ...

  8. android高德地图点平滑移动,【高德地图SDK】如何实现轨迹平滑移动?

    很多人应该都有类似的经历,叫完车,想看看车离我还有多远距离?但手机屏幕上的车不是一动不动,就是一跳一跳的漂移. 目前市面上大多产品"轨迹平滑移动"做的并不好. 市面上只有快的打车和 ...

  9. android 基于高德地图的轨迹回放

    android 基于高德地图的轨迹回放 前段时间公司项目有一个需求,就是需要看到设备上传之后的轨迹路线,并且可以实现回放的整个过程,功能包括路线回放.地图位置插点.回放之后的轨迹标记颜色.回放加速等功 ...

最新文章

  1. 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI
  2. [c++] vector<vector<int>>排序
  3. why do not do consultant any more?
  4. 《Python入门经典》——导读
  5. WebAPI(part11)--DOM重点核心
  6. 【转载】程序员技术练级攻略
  7. surging 微服务引擎 2.0 会有多少惊喜?
  8. html复选框值改变后事件,javascript – 从onclick/onchange事件获取HTML值的复选框
  9. hdoj-2028-Lowest common multiple plus
  10. Firefox 技巧
  11. 【TCP/IP】【测试】常用发流软件一览
  12. 数学基础30讲:第一讲 高等数学预备知识
  13. 热敏打印机的工作原理
  14. java代码防查重工具_代码查重工具sim
  15. OA自动化制造自动化
  16. 带你快速入门AXI4总线--汇总篇
  17. revit 对计算机最低配置,Revit2016官方推荐电脑配置要求
  18. Oracle安装提示无效条目,oracle NET 无效条目,要求有效的“服务名”
  19. Join the IT | 一个初生程序猿的内心独白
  20. kkFileView集成LibreOffice,解决部分文档预览500

热门文章

  1. JAVA通过tcp通信劳易测BCL 308i扫码枪获取数据
  2. HiFT: Hierarchical Feature Transformer for Aerial Tracking分层特征Transformer的无人机跟踪
  3. 接口文档规范有哪些?
  4. Rust结伴学习 — 前言
  5. Java Web实用开发技术
  6. jsp制作的个人网站
  7. A* 流程+代码详细注释
  8. visio自己画的图怎么填充_VISIO自定义图形填充
  9. HDU Tody HDU2112
  10. Matlab高光谱遥感、数据处理与混合像元分解实践技术应用