出自:http://www.tot.name/html/20141227/20141227103914.htm 注:转载请注明出处
本例使用的百度地图,在项目需求中需要这么一个功能:首先显示地图,在地图的中间显示一个标注(Marker),移动此标注后可以获取该Marker新的坐标。研究了下百度的接口文档,在其3.2(一开始用的3.0版,没有这个功能)版本中有新增加了draggable方法:
OverlayOptions option = new MarkerOptions().position(point).icon(bitmap).zIndex(999999).draggable(true);
上面的draggable即可设置标注(marker)是可以移动的,然后监听这个marker移动完成后的坐标即可。下面是代码:
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding); LatLng point = new LatLng(lat,lng); OverlayOptions option = new MarkerOptions().position(point).icon(bitmap).zIndex(999999).draggable(true); //在地图上添加Marker Marker marker = (Marker) (mBaiduMap.addOverlay(option)); //移动监听 mBaiduMap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() { public void onMarkerDrag(Marker marker) { //拖拽中 } public void onMarkerDragEnd(Marker marker) { //拖拽结束 my_lat=marker.getPosition().latitude; my_lng=marker.getPosition().longitude; tvmyloc.setText(my_lat+":"+my_lng); } public void onMarkerDragStart(Marker marker) { //开始拖拽 } }); |
上面的方法就可以实现手拖动标注,移动到新的位置后,就可以得到新的坐标值了。不过有一点不太好的是,要移动坐标需要先长按标注然后才能拖动,操作性不太友好(因为地图本身也支持拖动,所以百度的sdk中这么设置也是没有办法的)。
下面就说一下,类似微信中发送地理位置时那种地图拖动,标注的水滴始终位于地图的中间的实现方法:
其实思路很简单,我们使用android中的FrameLayout放两个view,一个是百度地图MapView,另一个是ImageView(它就是始终显示在地图中间的那个标注图标),让这个ImageView的android:layout_gravity="center"即可。
剩下工作就是当移动地图时,我们通过监听获取地图的中心点的坐标就OK了,下面是具体代码:
/*map dragg */ mBaiduMap.setOnMapStatusChangeListener( new BaiduMap.OnMapStatusChangeListener() { /** * 手势操作地图,设置地图状态等操作导致地图状态开始改变。 * @param status 地图状态改变开始时的地图状态 */ public void onMapStatusChangeStart(MapStatus status){ } /** * 地图状态变化中 * @param status 当前地图状态 */ public void onMapStatusChange(MapStatus status){ } /** * 地图状态改变结束 * @param status 地图状态改变结束后的地图状态 */ public void onMapStatusChangeFinish(MapStatus status){ LatLng ll=status.target; my_lat=ll.latitude; my_lng=ll.longitude; Log.d("map change","sts ch fs:"+my_lat+","+my_lng+""); } }); |
两种方法对比一下,还是第二种比较方便。代码很少,实现很简单吧:)。