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画的虚线好像不能刷新,望有知道的大佬评论留言,感谢
文章来源: Mapbox 创建可拖动marker