轨迹播放

首先上视频效果(本来是要弄成GIF动态图的,但是手机将图片用微信发到电脑,电脑修改后缀名后还是不能展示)

在实现前需要先初始化和定义一些变量(大佬可以直接跳过),坐标列表和起点以及终点坐标根据各自的真实情况去赋值,这里就不显示了。

    //获取的坐标列表private List<LatLng> points;//起点和终点坐标--用于给起点和终点做标记,不需要可以去掉private LatLng latLngStart, latLngEnd;private MapView mMapView = null;//xml布局的地图控件private AMap aMap;//高德地图mapprivate ImageView mPlayBtn;//播放暂停按钮private SeekBar mProgressBar;//进度条boolean isFirstMove = true;//是否首次移动boolean isPlay = true;//是否正在移动private SmoothMoveMarker smoothMoveMarker;//控制车辆运动的对象private int current;//当前滑动到的值private int poiSize;//记录轨迹数据的数量--用于设计进度条的大小private double totalTime;//轨迹总时间--用于设计进度条的总时间,可以自己设置固定值private Timer timer;//计时器,用于控制进度条自动滑动//onCreate方法就不说明了private void initView() {//高德地图所需的配置ServiceSettings.updatePrivacyShow(getContext(), true, true);ServiceSettings.updatePrivacyAgree(getContext(), true);mMapView = (MapView) findViewById(R.id.mapView);//地图组件//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图mMapView.onCreate(savedInstanceState);aMap = mMapView.getMap();mPlayBtn = findViewById(R.id.play_btn);//播放按钮mProgressBar = findViewById(R.id.progress_bar);//进度条//是否第一次显示,是则初始化数据if (isFirstMove)initData();//该方法用于获取轨迹的列表值,在这里给points赋值//赋值-points为轨迹点列表latLngStart = points.get(0);//起点坐标latLngEnd = points.get(points.size() - 1);//终点坐标poiSize = points.size();//记录总数量totalTime = ((double) poiSize) / 30;//记录总时间mProgressBar.setMax(poiSize);//进度条设置最大值setMap();//设置地图的方法initListener();//点击事件函数}//下面的地图根据生命周期的配置@Overridepublic void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overridepublic void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}@Overridepublic void onDestroy() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onDestroy();}@Overridepublic void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态mMapView.onSaveInstanceState(outState);}

下面写setMap()方法,主要是定位到起点,绘制起点和终点的标记和绘制轨迹线。

    private void setMap() {//定位到起点--latLngStart为起点坐标,12为图层,控制地图比例,可以自己根据需要修改CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLngStart, 12);aMap.moveCamera(cameraUpdate);//绘制起点的标记MarkerOptions startOptions = new MarkerOptions();BitmapDescriptor startBit = BitmapDescriptorFactory.fromResource(R.drawable.icon_start);//起点坐标图片startOptions.position(latLngStart).icon(startBit);aMap.addMarker(startOptions);//绘制终点的标记MarkerOptions endOptions = new MarkerOptions();BitmapDescriptor endBit = BitmapDescriptorFactory.fromResource(R.drawable.icon_end);//终点坐标图片endOptions.position(latLngEnd).icon(endBit);aMap.addMarker(endOptions);//绘制轨迹线--points轨迹点列表,5-线的宽度,0xAAFFC107为16进制的颜色PolylineOptions lineOptions = new PolylineOptions().addAll(points).width(5).color(0xAAFFC107);Polyline polyline = aMap.addPolyline(lineOptions);//轨迹动画方法--points为轨迹点列表,true为设置是否要让小车动起来setStartAnimation(points, true);}

setStartAnimation(points, true);方法,用于控制小车运动和进度条移动

    //points轨迹点列表,isMove设置是否播放private void setStartAnimation(List<LatLng> points, boolean isMove) {//如果不为空说明以及有轨迹播放了,将原来的轨迹清除if (smoothMoveMarker != null) {smoothMoveMarker.stopMove();smoothMoveMarker.removeMarker();}//若计时器不为空则清除,再重新设定计时器--自定义的函数,实现方法放在后面stopTimer();//设置滑动的图标smoothMoveMarker = new SmoothMoveMarker(aMap);smoothMoveMarker.setDescriptor(BitmapDescriptorFactory.fromResource(R.drawable.icon_truck));//里面为小车的图片,可以自己选图片LatLng drivePoint = points.get(0);Pair<Integer, LatLng> pair = SpatialRelationUtil.calShortestDistancePoint(points, drivePoint);points.set(pair.first, drivePoint);List<LatLng> subList = points.subList(pair.first, points.size());//设置滑动的轨迹左边点smoothMoveMarker.setPoints(subList);//设置滑动的总时间,current为点击进度条时记录的数值,然后根据数值计算前面的部分所占比例double cur = ((double) current) / poiSize;smoothMoveMarker.setTotalDuration((int) (totalTime * (1 - cur) + 0.5));//如果需要播放再开启计时器,计时器开启则会移动进度条if (isMove) {//开启计时器--自定义的函数,实现方法放在后面startTimer();//开始滑动小车,轨迹播放开始smoothMoveMarker.startSmoothMove();//将播放按钮的图片改为暂停图标mPlayBtn.setBackground(getResources().getDrawable(R.drawable.icon_pause_video));isPlay = true;//将播放状态设置为true} else {//将播放按钮的图片改为播放图标mPlayBtn.setBackground(getResources().getDrawable(R.drawable.icon_play_video));isPlay = false;//将播放状态设置为false}}

接下来说明开启计时器和暂停计时器的方法start Timer()和stop Timer()

    /*** 开启计时方法*/public void startTimer() {timer = new Timer();TimerTask task = new TimerTask() {@Overridepublic void run() {mProgressBar.setProgress(mProgressBar.getProgress() + 3);}};timer.schedule(task, 100, 100);}/*** 暂停计时方法*/public void stopTimer() {if (timer != null) {timer.cancel();timer = null;}}

最后一步,点击事件方法 initListener()

    /*** 点击事件*/private void initListener() {//播放监听mPlayBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (isPlay) {//如果正在播放则变为暂停smoothMoveMarker.stopMove();isPlay = !isPlay;//将播放按钮的图标改为播放图标mPlayBtn.setBackground(getResources().getDrawable(R.drawable.icon_play_video));//暂停计时器stopTimer();} else {//如果播放暂停则开始播放smoothMoveMarker.startSmoothMove();isPlay = !isPlay;//将播放按钮的图标改为暂停图标mPlayBtn.setBackground(getResources().getDrawable(R.drawable.icon_pause_video));//开启计时器startTimer();}}});//进度条监听mProgressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean b) {//progress当前进度值--当进度条的数值改变时就会调用该方法current = progress;//记录当前值if (current == poiSize) {//如果当前值为最大值,则将进度条清零,轨迹暂停mProgressBar.setProgress(0);setStartAnimation(points, false);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {//点击了进度条}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//停止点击进度条//newpoints用于保存点击进度条后剩余轨迹的轨迹点列表List<LatLng> newpoints = new ArrayList<>();//计算点击后要跳过的部分所占总长的比例double cur = ((double) current) / poiSize;//根据比例计算起点值,如果总长是根据轨迹点的数量设定的,可以直接 i=currentfor (int i =  (int) (cur * points.size()); i< points.size(); i++) {newpoints.add(points.get(i));}//如果剩余轨迹不为空且长度不为0则开启播放if (newpoints != null && newpoints.size() > 0) {setStartAnimation(newpoints, true);}}});}

总体就是这样吧,一个效果自己弄了三天,一开始用百度地图,但是里面斜率和小车的旋转角度什么的得自己计算,我感觉会比较麻烦,于是转为高德,不需要去计算这些,感觉会方便一些,由于没有单独弄出来demo,所以没有单独发到git,但是注释以及很详细了,后续有需要可以整合到git上发布。

Android使用高德地图实现轨迹播放和进度条控制相关推荐

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

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

  2. Android实现高德地图轨迹回放

    Android实现高德地图轨迹回放 写在前面 准备 官方文档解读 创建应用: 地图api引入: 权限添加 效果展示 过程实现 地图初始化 定位 显示标记点 点平滑移动 添加呼吸点 写在结尾 写在前面 ...

  3. android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet

    原标题:Android 仿高德地图可拉伸的BottomSheet 2018安卓巴士开发者大会-上海站 你一直期待的安卓技术盛宴即将登场! 前言 最近项目中需要用到高德地图搜索结果后的结果展示的可拉伸控 ...

  4. 高德地图3D轨迹回放 + 视野跟随功能

    高德地图3D轨迹回放 + 视野跟随功能 概述 代码实现步骤 完整代码 (需要添加一个2.0的key) 概述 若有帮助到你,麻烦点一波关注,博主会持续推出Echarts,D3,地图,Three.js方面 ...

  5. Android使用高德地图api实现基础定位

    Android使用高德地图api实现基础定位(一) 关于 会获取SHA1的可自行跳过这一步 第二步引用高德sdk 第三步修改MainActivity.java 关于 这篇主要讲如何使用高德sdk(不是 ...

  6. Android调用高德地图直接导航的简单实例

    在学校最近做了一个小APP,脑子笨怕忘,写个博客记录一下. 简单来说就是保存地点,然后单击直接打开高德地图APP并从当前所在地导航到保存的地点.因为是小型学习用的,所以保存地点采用了Android本地 ...

  7. 【Android】高德地图在Debug模式下运行正常但是打Release包时则闪退解决办法

    [Android]高德地图在Debug模式下运行正常但是打Release包时则闪退解决办法 来源: https://blog.csdn.net/weixin_39370093/article/deta ...

  8. 高德地图轨迹PHP,高德地图JSAPI轨迹重复绘制

    介绍一个基于高德地图JSAPI轨迹展示案例: 说明: 1.定时接口取数据刷新轨迹: 2.轨迹坐标数量较大: 3.轨迹点位信息需要展示,如时间.速度.多少点位: 4.避免地图重新渲染,只刷新坐标: 使用 ...

  9. 计算机设计基于Android实现高德地图校内导航出行app【项目源码+简要论文说明】

    基于Android实现高德地图校内导航出行app项目演示 如今手机的发展非常迅速,手机越来越成为人们不可缺少的东西.手机从最初功能简单的功能机,发展到如今几乎无所不能的智能机,满足了人们的日常需求,手 ...

最新文章

  1. 【bat脚本】使用ffmpeg工具剥离某一个声道
  2. [你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)
  3. android 8.0的imei简书,Android 8.0通知栏渠道,渠道组的适配和使用
  4. 【转】Step By Step在VS2008中完整配置Ajax Toolkit的使用(配图)
  5. lsass.exe文件丢失,损坏
  6. 面试官问:HTTP 的负载均衡你了解么?你不是说了你们用的Nginx么?说一下把。...
  7. SQL Server 2005 Analysis Services实践(一)
  8. mysql中子查询的概念_Mysql子查询的概念、分类、语法
  9. 使用Android 实现计算器功能
  10. SCM供应链协同管理系统解决方案
  11. gma 教程 | 气候气象 | 计算标准化降水指数(SPI)
  12. Linux上:使用VMware17安装Centos8.5并配置网络、WSL安装Ubuntu、
  13. 生信步骤|转录组测序上游分析:hisat2+samtools+stringtie
  14. configure详解
  15. Cesium粒子系统-喷水效果
  16. C语言 java 解一元二次方程
  17. tabBar的简单使用,以及扩展
  18. 通过JS在网页中隐藏URL
  19. Class^=,Class*= ,Class$=含义
  20. TMM交稿时的注意事项

热门文章

  1. Typora修改图片保存位置
  2. leetcode——第322题——零钱兑换
  3. python爬取微博评论数据的github链接_GitHub - 13633825898/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...
  4. 百度网盘如何免费上传大于4GB的文件(制作BT文件)
  5. 安卓测试二(Espresso)
  6. B端和C端产品主要差异:用户、体验、数据
  7. 网页自动加拼音html,javascript实现输入中文自动生成拼音
  8. android自动夜间模式吗,Android夜间模式的实现方案
  9. AcWing 4246. 最短路径和(反向建图+链式前向星+堆优化)
  10. ONEDNS配置2:centos7DNS服务器VA转发器配置