百度地图,Android显示车辆轨迹动画

初次设计想就用百度自带的显示覆盖物的方式,计算两个坐标点的距离,添加短距离的坐标点,然后在密密麻麻的坐标点之间显示,隐藏覆盖物,形成移动的视觉效果。
后来发现会创建较大的内存,而且效果不佳。
最后选择添加View的方法,利用addView方法添加小车的view,利用Android动画,同步和异步结合显示小车运行。
主要几个注意点和方案是:
  1. 计算小车转弯的角度,判断顺时逆时针。
  2. 计算地图缩放比例,依据是一组经纬度的最大距离值
  3. 在显示动画的时候地图是不能缩放的,因为经纬度和屏幕坐标转化不是实时的,数据是在调用接口时屏幕当前的比例尺转化。
  4. 还有就是当动画前屏幕被缩放了,轨迹已经超出了屏幕显示,就计算下一个车辆到达的点在不在屏幕上,不在的话就移动地图,将该点设置为中心点,这个并不完善

代码片段

地图移动到某一点,并且设置缩放比例。
    @Overridepublic void MoveToPoint(List<LatLng> list) {/*** 设置地图移动到指定位置*/// 定义地图状态//数字越小,比例尺越大Double lat=new Double(0),lng=new Double(0);double latlng[]=new double[2];int zooms=getZoomnum(latlng,list);Log.i(TAG, "lat lng:" + latlng[0] + "__  " + latlng[1]+"zoom   "+zooms);MapStatus mMapStatus = new MapStatus.Builder().target(new LatLng(latlng[0],latlng[1])).zoom(zooms).build();// 定义MapStatusUpdate对象,以便描述地图状态将要发生的变化MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);// 改变地图状态mBaiduMap.setMapStatus(mMapStatusUpdate);}
//根据轨迹,一组坐标值计算缩放比例public int getZoomnum(double[] lalg,final List<LatLng> pointlist){int zoomSize[]={5,10,20,50,100,200,500,1000,2000,5000,10000,20000};//分别对应于zoom 21,20,19,18,17,16,15,14,13,12,11,10int i,j;double max=0,temp;for(i=0;i<pointlist.size();i++){for(j=i+1;j<pointlist.size();j++){temp=DistanceUtil.getDistance(pointlist.get(i),pointlist.get(j));if(temp>max){max=temp;lalg[0]=(pointlist.get(i).latitude+pointlist.get(j).latitude)/2;lalg[1]=(pointlist.get(i).longitude+pointlist.get(j).longitude)/2;Log.i(TAG,"lat lng:"+lalg[0]+"_dadsa_  "+lalg[1]);}}}Log.i(TAG,"max:  "+max);for(i=0;i<11;i++){if(max>zoomSize[i]*12&&max<zoomSize[i+1]*12) {Log.i(TAG,"ixiabio: "+i);return 20 - i;}}if(max<zoomSize[0]*12)return 21;else return 10;}

利用向量知识计算方向角,顺时针旋转为正,逆时针为负。

  //计算两个向量的方向角,并根据顺时针返回正值,逆时针返回负值public float getangle(Point p1,Point p2,Point p3){double xp1p2=p2.x-p1.x;double yp1p2=p2.y-p1.y;double xp2p3=p3.x-p2.x;double yp2p3=p3.y-p2.y;double a1=Math.sqrt(xp1p2*xp1p2+yp1p2*yp1p2);double b1=Math.sqrt(xp2p3*xp2p3+yp2p3*yp2p3);double ab=xp1p2*xp2p3+yp1p2*yp2p3;float angle;if((a1*b1)!=0)angle =(float)Math.acos(ab/(a1*b1));else angle=0;double a_b=xp1p2*yp2p3-xp2p3*yp1p2;if(a_b<0)angle=-angle;return angle*180/(float)Math.PI;}

核心部分,动画绘制

//行车的时候,地图不能缩放,因为经纬度转化成坐标值是以当时地图的比例尺进行转化的public void rotateyAnimRun(final View view,final List<Point> list){//ObjectAnimator的父类是valueAnimator,爷爷类是Animator.List<Animator> lt= new ArrayList<Animator>();Log.i(TAG,"lt size: "+lt.size());int size=list.size();float t1=0f;AnimatorSet set = new AnimatorSet();int i=0;carPathlist_point=list;for (i=0;i<size-1;i++){Animator animator,animator2;int k=i;//计数车子不动相同的经纬度情况while(i<size-1&&list.get(i).x==list.get(i+1).x&&list.get(i).y==list.get(i+1).y)i++;if(i==size-1)break;Log.i(TAG,"坐标: "+list.get(i).x+"____"+list.get(i).y);//PropertyValuesHolder属性holder,分别设置X,Y方向的移动值,然后调用ofPropertyValuesHolder设置属性值,这个是异步叠加动画。//参数指的是相对于view最初位置的偏移值PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("translationX", list.get(i).x-list.get(0).x,list.get(i+1).x-list.get(0).x);PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("translationY", list.get(i).y-list.get(0).y,list.get(i+1).y-list.get(0).y);PropertyValuesHolder pvhR;//监听在小车运行的时候如果下一个坐标点不在地图内,则将地图的中心点设置为下一个坐标点。class newAnListener implements Animator.AnimatorListener{private int center;public newAnListener(int center_){center=center_;}@Overridepublic void onAnimationStart(Animator animation) {WindowManager wm = (WindowManager) BaiduMapActivity.this.getSystemService(Context.WINDOW_SERVICE);int width = wm.getDefaultDisplay().getWidth();int height = wm.getDefaultDisplay().getHeight();Log.i(TAG, "width: " + width + "height: " + height + "mapCenter: " + center);Log.i(TAG, "x: " + list.get(center + 1).x + "y: " + list.get(center + 1).y);if (list.get(center + 1).x < 0 ||list.get(center + 1).y < 0 ||list.get(center + 1).x > width ||list.get(center + 1).y > height) {Log.i(TAG, "不是大了就是小了");MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newLatLng(carPathlist.get(center));// 改变地图状态mBaiduMap.setMapStatus(mMapStatusUpdate);}}@Overridepublic void onAnimationEnd(Animator animation) {}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}};if(k==0) {float angle =getangle(new Point(list.get(i).x-1,list.get(i).y),list.get(i),list.get(i+1));Log.i(TAG, "angle:   "+angle);t1=t1+angle;pvhR = PropertyValuesHolder.ofFloat("rotation", t1);animator2=ObjectAnimator.ofPropertyValuesHolder(view, pvhR).setDuration(500);animator2.addListener(new newAnListener(i));}else{Log.i(TAG,"k:   "+k+"i:   "+i);float angle =getangle(list.get(k-1),list.get(i),list.get(i+1));Log.i(TAG, "angle:   "+angle);t1=t1+angle;pvhR = PropertyValuesHolder.ofFloat("rotation", t1);animator2=ObjectAnimator.ofPropertyValuesHolder(view, pvhR).setDuration(500);animator2.addListener(new newAnListener(i));}animator= ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY).setDuration(1000);//先旋转再直行lt.add(animator2);lt.add(animator);}//顺序执行Animator list中的动画效果set.playSequentially(lt);set.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {//所有手势不可用mUiSettings.setAllGesturesEnabled(false);mMapView.showZoomControls(false);lay_showpath.setClickable(false);Log.i(TAG, "set_____________start");}@Overridepublic void onAnimationEnd(Animator animation) {mMapView.removeViewInLayout(view);//所有手势可用mUiSettings.setAllGesturesEnabled(true);mMapView.showZoomControls(true);lay_showpath.setClickable(true);Log.i(TAG, "set_____________end");}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});
//可以将会设置绘制动画,设置在监听百度地图已经加载完毕的事件里set.start();Log.i(TAG, "lt end size: " + lt.size());}

添加该view到百度地图。

    @Overridepublic void    DrawDynaPath(final List<LatLng> pointlist) {//获取小车的viewBitmap bitmap= BitmapFactory.decodeResource(getResources(), R.drawable.ic_vehicle_location_current);ImageView iv=new ImageView(this);iv.setImageBitmap(bitmap);Log.i(TAG, "size():" + pointlist.size());Projection pj=mBaiduMap.getProjection();//所有经纬度转化成坐标List<Point> list=new ArrayList<Point>();for(LatLng ll:pointlist){list.add(pj.toScreenLocation(ll));}mMapView.removeViewInLayout(iv);//    layoutMode(MapViewLayoutParams.ELayoutMode mode 指定 MapViewLayoutParams 的方式:屏幕坐标或者地图经纬度坐标//absoluteMode是不随地图变化而移动的,mapMode是随地图移动MapViewLayoutParams mlp = new MapViewLayoutParams.Builder().layoutMode(MapViewLayoutParams.ELayoutMode.mapMode).position(pointlist.get(0)).width(MapViewLayoutParams.WRAP_CONTENT).height(MapViewLayoutParams.WRAP_CONTENT).build();Log.i(TAG,"list.get(0):"+list.get(0).toString());
//        mMapView.removeAllViews();rotateyAnimRun(iv, list);mMapView.addView(iv, mlp);
//        layout_baidumap.removeAllViewsInLayout();
//        mMapView.addView(parent);mMapView.refreshDrawableState();}

百度地图——显示小车轨迹动画回放相关推荐

  1. 【百度地图】BMapGL 轨迹动画指向地球中心(0,0),轨迹坐标点定位不准、点漂移到几内亚湾

    百度地图官方的轨迹动画:轨迹动画 使用百度地图BMapGL 模拟轨迹动画时出现这种情况 第一种解决方法: 官方给出的解决方法是在public/index.html中引入 <script type ...

  2. 百度地图api实现轨迹运动效果

    百度地图api实现轨迹运动效果 实现逻辑: 实现轨迹运动的效果无非就是将一段路程细化为很多个点,然后不过的根据这些点来画出移动轨迹. 实现流程: 1)使用DrivingRoute,根据起点和终点的位置 ...

  3. android百度地图轨迹实现,android 获取GPS经纬度在百度地图上绘制轨迹

    实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /** * 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标 ...

  4. android 获取GPS经纬度在百度地图上绘制轨迹

    实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /*** 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标* ...

  5. vue使用高德地图制作小车轨迹回放动画简单案例

    首先在根目录public中的index.html引入高德地图 <script type="text/javascript" src="https://webapi. ...

  6. 使用百度地图实现车辆轨迹回放

    最近在做的项目有个车辆轨迹回放需求,查资料看到可以使用百度地图的路书功能实现,百度路书功能如下. 点击开始按钮,小车会在地图上移动还原历史轨迹. 具体需求就是通过调用后台接口获取到指定车辆的指定时间段 ...

  7. vue使用高德地图aMap实现轨迹动画查询显示

    vue使用高德地图搜索地址添加标记marker,定位,拖拽选址功能https://blog.csdn.net/SmartJunTao/article/details/123955679 实现效果: 需 ...

  8. 百度地图坐标点轨迹画线php,百度地图绘制轨迹点

    没有后台获取事实信息 都是伪数据- -轨迹信息做不到事实导航. 控件可以根据自己的需求添加 位置通过offset:new BMAP.Size(x,y)进行微调 事实路况信息需要通过引没有后台获取事实信 ...

  9. 地图 显示 动态轨迹_【对讲机的那点事】你了解公网对讲机的地图调度功能吗?...

    点击上面微信号关注我关注我哟 定期推送对讲机行业资讯,华安捷讯对讲机公司的产品优惠等诸多优质内容,最接地气.重服务的对讲机行业微信平台!微信号:shuziduijiangji ID号:gh_778e0 ...

最新文章

  1. 数据挖掘流程(四):建模调参
  2. is_numeric函数的引起的一个BUG说起
  3. 监听输入 vue_深度对比vue与react创建APP的差别,值得收藏
  4. JavaScript学习总结(七)——JavaScript函数(function)
  5. django项目时间与Ubuntu时间不一致
  6. HTTP Error 502.5 - Process Failure 解决方案
  7. 深度学习根据文字生成图片教程(附python代码)
  8. oracle中lag()函数和lead()函数的用法(图文)
  9. 循环buffer的实现_Go语言源码阅读之bytes.Buffer
  10. linux 微信机器人,开源Linux操作系统的机器人(组图)
  11. 2016计算机考研经验,2016届浙大计算机考研复习经验整理
  12. 学校计算机联想硬盘保护系统管理员密码,联想硬盘保护系统管理员密码是多少...
  13. Exp3 免杀原理与实践 20154328 常城
  14. 国开网电大 动物常见病防治 形考任务1-5
  15. 服务器搭建织梦cms系统,零基础使用织梦cms搭建自己的网站「织梦建站」
  16. 如何使用保存实例状态保存活动状态?
  17. Ubuntu常用磁盘工具Disks、GParted和系统清理应用Cleaner
  18. 关于大学初入计算机学习的一些建议
  19. 特斯拉和拼多多,到底在「较真儿」什么?
  20. TexMaker(Latex编辑器)软件的“文献引用”操作:Xelatex方式运行的操作方法

热门文章

  1. 越南是下一个电商天堂——扬帆牧哲
  2. Python人工智能之图片识别,一行代码实现图片文字识别
  3. java如何输入字符串?
  4. GDC2016【For Honor-荣耀战魂】的次世代动画技术
  5. Linux-基础命令练习
  6. org.hibernate.engine.query.spi.QueryPlanCache引起内存泄漏问题排查
  7. 油画学习的注意点,初学者要先了解这些步骤
  8. GA用什么计算机语言写,PLC五种编程语言
  9. 三维动画在计算机上的应用,三维动画在建筑施工中的应用
  10. [SDOI2017]苹果树 题解