如何实现拖放Android标记?

喜? 我正在Android上使用MapView应用程序。 我有三个标记,我希望能够稍后使用Google Map API getlocation函数。 为了尝试它,我想用拖放function来移动标记,然后检查位置。

谁得到了一个拖放工作的Android标记,或知道一个方法开始搞清楚?

/ AK

以下是 我的书籍中的 一个示例项目 , 其中显示了Android中Google Map上的标记的拖放移动。

简而言之,它使用onTouchEvent()来检测用户何时触摸并将手指握在标记附近。 然后,它会从叠加层中删除标记,但使用RelativeLayout将相同的图像置于地图顶部。 然后,在“移动”触摸事件时,图像被移动(比强制整个覆盖层重绘更快)。 当手指抬起时,图像被移除,但是标记被放回到新的地点的覆盖层中。

实施Google Maps Android API v2,请参考: https : //developers.google.com/maps/documentation/android/,并在GoogleMap对象setOnMarkerDragListener上设置。 例如:

 map.setOnMarkerDragListener(new OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker arg0) { // TODO Auto-generated method stub Log.d("System out", "onMarkerDragStart..."+arg0.getPosition().latitude+"..."+arg0.getPosition().longitude); } @SuppressWarnings("unchecked") @Override public void onMarkerDragEnd(Marker arg0) { // TODO Auto-generated method stub Log.d("System out", "onMarkerDragEnd..."+arg0.getPosition().latitude+"..."+arg0.getPosition().longitude); map.animateCamera(CameraUpdateFactory.newLatLng(arg0.getPosition())); } @Override public void onMarkerDrag(Marker arg0) { // TODO Auto-generated method stub Log.i("System out", "onMarkerDrag..."); } }); //Don't forget to Set draggable(true) to marker, if this not set marker does not drag. map.addMarker(new MarkerOptions().position(crntLocationLatLng).icon(BitmapDescriptorFactory .fromResource(R.drawable.icon_my_location)).draggable(true)); 

我发现了CommonsWare拖放function的一些优化。

我在地图上用标记做了一些精确的测量,我希望我的标记正好在我触摸的位置,抬起我的手指,这样测量就是精确的。

在CommonsWare的原稿上,如果您触摸“靠近”标记,标记不会到达该确切位置,而是随着手指的移动而移动。 我需要标记出现在ACTION_DOWN,ACTION_MOVE和ACTION_UP的手指下方。

这里是代码,如果有人需要它。 我不得不感谢CommonsWare做这个function,这真是一个好主意。

这是我修改的代码的一部分。

我的MapView是mapa;

  @Override public boolean onTouchEvent(MotionEvent event, MapView mapView) { final int action=event.getAction(); final int x=(int)event.getX(); final int y=(int)event.getY(); boolean result=false; if (action==MotionEvent.ACTION_DOWN) { for (OverlayItem item : mOverlays) { Point p=new Point(0,0); mapa.getProjection().toPixels(item.getPoint(), p); //I maintain the hitTest's bounds so you can still //press near the marker if (hitTest(item, marker, xp.x, yp.y)) { result=true; inDrag=item; mOverlays.remove(inDrag); populate(); //Instead of using the DragImageOffSet and DragTouchOffSet //I use the x and y coordenates from the Point setDragImagePosition(x, y); dragImage.setVisibility(View.VISIBLE); break; } } } else if (action==MotionEvent.ACTION_MOVE && inDrag!=null) { setDragImagePosition(x, y); result=true; } else if (action==MotionEvent.ACTION_UP && inDrag!=null) { dragImage.setVisibility(View.GONE); //I get the geopoint without using any OffSet, directly with the //Point coordenates GeoPoint pt=mapa.getProjection().fromPixels(x,y); OverlayItem toDrop=new OverlayItem(pt, inDrag.getTitle(), inDrag.getSnippet()); orig = inDrag.getMarker(0); //In my case I had down heading Arrows as markers, so I wanted my //bounds to be at the center bottom toDrop.setMarker(boundCenterBottom(orig)); mOverlays.add(toDrop); populate(); inDrag=null; result=true; } return(result || super.onTouchEvent(event, mapView)); } private void setDragImagePosition(int x, int y) { RelativeLayout.LayoutParams lp= (RelativeLayout.LayoutParams)dragImage.getLayoutParams(); //Instead of using OffSet I use the Point coordenates. //I want my arrow to appear pointing to the point I am moving, so //I set the margins as the Point coordenates minus the Height and half the //width of my arrow. lp.setMargins(x-(dragImage.getWidth()/2),y-dragImage.getHeight(), 0, 0); dragImage.setLayoutParams(lp); } 

有了这个,你就可以让你的箭头出现在你按下的位置,而不是从那里移动的箭头。

这里是在Android的Mapview拖放引脚的完整代码

对于MapsV2。 使用谷歌地图事件。 不要写你自己的。

  mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { mVisitingMarker.setPosition(latLng); mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); } }); mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker arg0) { } @SuppressWarnings("unchecked") @Override public void onMarkerDragEnd(Marker arg0) { Log.d("System out", "onMarkerDragEnd..."); mMap.animateCamera(CameraUpdateFactory.newLatLng(arg0.getPosition())); } @Override public void onMarkerDrag(Marker arg0) { } });