Создание OnDragListener для Google Map v2 Фрагмент

Я пытаюсь настроить onDrag Listener для фрагмента карты google, но не могу запустить событие drag. Поскольку карта не поддерживает прямые события перетаскивания, я пытаюсь реализовать прослушиватель перетаскивания для представления. Я знаю о событии onMarkerDrag, но это не делает мне ничего хорошего, поскольку я не пытаюсь перемещать маркеры.

Причина захвата событий перетаскивания карты двояка:

Сначала нужно определить, запустил ли пользователь карту. Если они этого не сделали, мне нравится сохранять свое местоположение на экране и оживлять их местоположение, если оно отсутствует на карте. Если они запустили карту, я предполагаю, что они знают, что они хотят видеть, и вынуждают местоположение на экране. (Это похоже на то, что должно быть включено в 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 никогда не срабатывает. Есть идеи?

1) Создайте класс оболочки:

 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) Создайте подкласс класса MapFragment:

 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(); } } });