为Google Map v2片段创buildOnDragListener

我正在尝试为Google地图片段设置onDrag侦听器,但无法触发拖动事件。 由于地图不支持直接拖动事件,我正在试图为视图实现一个拖动监听器。 我知道onMarkerDrag事件,但是这并不是我的好处,因为我不想移动标记。

陷印地图拖动事件的原因是双重的:

首先检测用户是否已经平移了地图。 如果他们没有,我喜欢在屏幕上保留他们的位置,如果不在地图上,他们的位置是animation的。 如果他们已经摆脱了地图,我认为他们知道他们想看什么,并强制屏幕上的位置。 (这看起来应该包含在API中)

陷印的第二个原因是允许用户在地图上绘制线条和多边形。 我可以使用onTap事件(添加点)来做到这一点,但我希望能够让他们写意。

我的代码如下所示:

主要活动:

mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); setUpMapIfNeeded(); mMapView = findViewById(R.id.map); myMapDragListener = new MapDragListener(); mMapView.setOnDragListener(myMapDragListener); 

听众:

 public class MapDragListener implements OnDragListener { /** * */ public MapDragListener() { super(); say.logCat("MapDragListener: I'm ALIVE!!!!"); } private AkamaiAnnounce say = new AkamaiAnnounce(); private boolean inDrag; private boolean hasPanned=false; @Override public boolean onDrag(View v, DragEvent event) { say.logCat("MapDragListener.onDrag: " + event.toString()); //String dotTAG = (String) getTag(); if (event.getLocalState() != this) { return false; } boolean myResult = true; int action = event.getAction(); float x = event.getX(); float y = event.getY(); switch (action) { case DragEvent.ACTION_DRAG_STARTED: inDrag = true; break; case DragEvent.ACTION_DRAG_LOCATION: break; case DragEvent.ACTION_DRAG_ENTERED: break; case DragEvent.ACTION_DRAG_EXITED: break; case DragEvent.ACTION_DROP: myResult = false; break; case DragEvent.ACTION_DRAG_ENDED: inDrag = false; // change color of original dot back hasPanned=true; break; default: myResult = false; break; } return false; //return myResult; } public boolean hasPanned() { return hasPanned; } public void setHasPanned(boolean hasPanned) { this.hasPanned = hasPanned; } } 

地图工作正常。 侦听器实例化,但我的onDrag事件从不会触发。 有任何想法吗?

Solutions Collecting From Web of "为Google Map v2片段创buildOnDragListener"

1)创build包装类:

 public class MapWrapperLayout extends FrameLayout { public interface OnDragListener { public void onDrag(MotionEvent motionEvent); } private OnDragListener mOnDragListener; public MapWrapperLayout(Context context) { super(context); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (mOnDragListener != null) { mOnDragListener.onDrag(ev); } return super.dispatchTouchEvent(ev); } public void setOnDragListener(OnDragListener mOnDragListener) { this.mOnDragListener = mOnDragListener; } } 

2)创buildMapFragment类的子类:

 public class CustomMapFragment extends SupportMapFragment { private View mOriginalView; private MapWrapperLayout mMapWrapperLayout; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mOriginalView = super.onCreateView(inflater, container, savedInstanceState); mMapWrapperLayout = new MapWrapperLayout(getActivity()); mMapWrapperLayout.addView(mOriginalView); return mMapWrapperLayout; } @Override public View getView() { return mOriginalView; } public void setOnDragListener(MapWrapperLayout.OnDragListener onDragListener) { mMapWrapperLayout.setOnDragListener(onDragListener); } 

3.1)最后,在你的活动中:

  // Google map init block CustomMapFragment customMapFragment = ((CustomMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)); customMapFragment.setOnDragListener(new MapWrapperLayout.OnDragListener() { @Override public void onDrag(MotionEvent motionEvent) { Log.d("ON_DRAG", String.format("ME: %s", motionEvent)); // Handle motion event: } }); GoogleMap map = customMapFragment.getMap(); 

3.2)…并在你的布局:

 <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" android:name="your.package.CustomMapFragment"/> 

要获得一个包含googleMap的片段,可以使用下面的google方法。 我们可以得到地图的目标位置。

 googleMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() { @Override public void onCameraIdle() { Log.e(TAG,"==camera idle=="+ googleMap.getCameraPosition().target); } }); googleMap.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() { @Override public void onCameraMoveStarted(int reason) { if (reason ==REASON_GESTURE) { isMaptouched=true; Toast.makeText(getActivity(), "The user gestured on the map.", Toast.LENGTH_SHORT).show(); } else if (reason ==REASON_API_ANIMATION) { Toast.makeText(getActivity(), "The user tapped something on the map.", Toast.LENGTH_SHORT).show(); } else if (reason ==REASON_DEVELOPER_ANIMATION) { Toast.makeText(getActivity(), "The app moved the camera.", Toast.LENGTH_SHORT).show(); } } }); 

我使用BehaviorSubject做了类似的事情来判断地图是否脏(被用户移动)

  storeMap.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() { @Override public void onCameraMoveStarted(int reason) { if (reason == REASON_GESTURE) { mapIsDirty.onNext(true); } } }); storeMap.setOnCameraIdleListener(new OnCameraIdleListener() { @Override public void onCameraIdle() { if(mapIsDirty.getValue()) { // Do happy things mapIsDirty.onNext(false); } } });