Mapbox 创建可拖动marker

匿名 (未验证) 提交于 2019-12-03 00:19:01

mapbox的SDK没提供可拖动的marker,可把我坑惨了,网上找了许多都不能用,应该是因为sdk升级导致的,所以只能自己动手写一个了,这里用的版本是6.1.2:
关于MapView的初始化sdk里介绍的都很详细,这里就不讲了,进入主题:
我们在 mapView.getMapAsync()里:
1.保存MapboxMap实例
2.初始化Projection(用于获得坐标点和屏幕像素的映射关系)
3.设置mapView的触摸监听

//手机像素密度 float screenDensity = context.getResources().getDisplayMetrics().density;  mapView.getMapAsync(new OnMapReadyCallback() {             @Override             public void onMapReady(MapboxMap mapboxMap) {                 //保存MapboxMap实例                 map = mapboxMap;                 //.初始化Projection                 pj = map.getProjection();                 //设置mapView的触摸监听                 mapView.setOnTouchListener(new View.OnTouchListener() {                     @Override                     public boolean onTouch(View view, MotionEvent motionEvent) {                         if(motionEvent!=null){                             //手机触摸的位置                             PointF tapPoint = new PointF(motionEvent.getX(), motionEvent.getY());                             //左右偏移量                             float toleranceSides = 4 * screenDensity;                             //上下偏移量                             float toleranceTopBottom = 10 * screenDensity;                             //marker图标的长宽                             float averageIconWidth = 60;                             float averageIconHeight = 60;                             float left = tapPoint.x - averageIconWidth / 2 - toleranceSides;                             float top = tapPoint.y - averageIconHeight / 2 - toleranceTopBottom;                             float right = tapPoint.x + averageIconWidth / 2 + toleranceSides;                             float bottom = tapPoint.y + averageIconHeight / 2 + toleranceTopBottom;                             //基于触摸位置生成一个矩形                             RectF tapRect = new RectF(left , top, right , bottom );                             //判断是否有marker在这个矩形内                             boolean b = touchDeal(motionEvent, tapRect);                             return b;                         }                         return false;                      }                 });              }         });

touchDeal(),处理触摸事件,算了,看注释吧

    List<Marker> allmarkers = new ArrayList<>();     Projection pj;     Marker moveMarker = null;     List<Point> routeCoordinates = new ArrayList<>();  private boolean touchDeal(MotionEvent event,RectF rectf){         switch (event.getAction()){             case MotionEvent.ACTION_DOWN:             //获取地图上所有marker                 allmarkers = map.getMarkers();                 for (Marker marker:allmarkers) {                     //获取marker坐标对应的像素位置                     PointF pointF = pj.toScreenLocation(marker.getPosition());                     //marker是否在矩形内                     boolean contains = rectf.contains(pointF.x, pointF.y);                     //在矩形内保存此marker,并消费触摸事件                     if(contains){                         moveMarker = marker;                         return true;                     }                 }                 moveMarker = null;                 break;             case MotionEvent.ACTION_MOVE:             //如果保存需要移动的marker容器不为空,消费触摸事件                 if(moveMarker!=null){                     //获取当前触摸像素点                     PointF tapPoint = new PointF(event.getX(), event.getY());                     //将像素点转换为坐标                     LatLng latLng = pj.fromScreenLocation(tapPoint);                     //改变marker的位置                     moveMarker.setPosition(latLng);                     return true;                 }                 break;             case MotionEvent.ACTION_UP:                 moveMarker = null;                 break;             case MotionEvent.ACTION_CANCEL:                 moveMarker = null;                 break;          }         return false;     }

至此完成,严格来说不是创建了可拖动marker,只是监听地图的触摸事件,如果触摸的地方有marker,就消费触摸事件,接下来的滑动就不断改变marker的位置。
附:小菜不知道如何使用mapbox画虚线,而且是一条可以随时刷新的虚线,用LineLayer画的虚线好像不能刷新,望有知道的大佬评论留言,感谢

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!