2015-07-11 2 views
8

У меня есть поиск в центре карты Google, а масштабирование - с помощью двойного нажатия и увеличения для увеличения. Я нашел одно решение для Here, это только для двойного нажатия для увеличения.Как сделать Google в центре при использовании двойного нажатия и ущипнуть для увеличения андроида?

TouchableWrapper

public class TouchableWrapper extends FrameLayout { 

    GestureDetectorCompat mGestureDetector; 


    public TouchableWrapper(Context context) { 
     super(context); 
     mGestureDetector = new GestureDetectorCompat(context, mGestureListener); 
    } 


    private final GestureDetector.SimpleOnGestureListener mGestureListener 
      = new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Log.e("GestureDetector", "Executed"); 
      //Notify the event bus (I am using Otto eventbus of course) that you have just received a double-tap event on the map, inside the event bus event listener 
      EventBus_Singleton.getInstance().post(new EventBus_Poster("double_tapped_map")); 

      return true; 
     } 
    }; 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     mGestureDetector.onTouchEvent(ev); 
     return super.onInterceptTouchEvent(ev); 
    } 


} 

Я использовал Otto для триггера событий.

public class EventBus_Singleton { 

    private static final Bus BUS = new Bus(); 

    public static Bus getInstance() { 
     return BUS; 
    } 

    public EventBus_Singleton() { 
    } 

    public void post(String s) { 
     BUS.post(s); 
    } 
} 

EventBus_Poster

public class EventBus_Poster { 
    public final String string; 

    EventBus_Poster(String string) { 
     this.string = string; 
    } 
} 

В моей карте деятельности я использовал метод события Прием для увеличения карты на том же месте.

@Subscribe 
    public void EventBus_singleton(EventBus_Poster event) { 
     Log.e("EventBus_singleton", "Executed"); 
     if (event != null && event.string.equals("double_tapped_map")) { 
      if (mapFragment != null) { 
       mapFragment.getMap().getUiSettings().setZoomGesturesEnabled(false); 
       mapFragment.getMap().getUiSettings().setRotateGesturesEnabled(false); 

       mapFragment.getMap().setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
        @Override 
        public void onCameraChange(CameraPosition cameraPosition) { 
         LatLng lng = cameraPosition.target; 
         Log.e("LatLng", "" + lng); 
        } 
       }); 
       mapFragment.getMap().animateCamera(CameraUpdateFactory.zoomIn(), 400, null); 
      } 

     } 
    } 

Я пытался использовать ScaleGestureDetector.SimpleOnScaleGestureListener сделать щепотку зум, но он не работал, а также когда-то он запаздывает. Может ли кто-нибудь помочь мне сделать масштабирование на карте google?

+0

вы хотите остановить прокрутку? то вы можете использовать UiSettings.setScrollGesturesEnabled (false). – sachithkn

+0

Я хочу, чтобы карта оставалась в центре, когда я масштабирую ее, в обычном режиме, когда мы увеличим ее, она утащит. – Shvet

+3

По крайней мере, комментируйте, если у вас есть вопрос и дайте веские основания для этого. – Shvet

ответ

6

Ну, я обнаружил, что при попытке сделать это, успешный пинч-на-зум предполагает как скорости и масштаба условия. Скорость измеряется, чтобы определить, действительно ли вы хотите увеличить масштаб, в зависимости от того, насколько быстро вы сдвинули два пальца или ближе друг к другу, вы можете попробовать это внутри Карт Google и в приложении Uber, вы можете продолжать перемещать пальцы или ближе друг к другу, но так медленно, что вы будете не активировать событие масштабирования в/из на карте!

Так что определенно требуется скорость при попытке определить полный жест щепотки. Во-вторых, вам также нужен масштаб, и я напечатал значение шкалы, и это всегда меньше, чем точно 1.0, когда вы начинаете зажимать, чтобы уменьшить масштаб и всегда больше 1,0, когда вы начинаете зажимать, чтобы увеличить.

Сочетание этих двух, безусловно, получить лучшие результаты, см скорость первого я бы сказал

private final ScaleGestureDetector.OnScaleGestureListener mScaleGestureListener 
     = new ScaleGestureDetector.SimpleOnScaleGestureListener() { 
    /** 
    * This is the active focal point in terms of the viewport. Could be a local 
    * variable but kept here to minimize per-frame allocations. 
    */ 

    float startingSpan; 
    float startFocusX; 
    float startFocusY; 

    @Override 
    public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) { 
     startingSpan = scaleGestureDetector.getCurrentSpan(); 
     startFocusX = scaleGestureDetector.getFocusX(); 
     startFocusY = scaleGestureDetector.getFocusY(); 

     return true; 
    } 

    @Override 
    public boolean onScale(ScaleGestureDetector scaleGestureDetector) { 
     float scale = scaleGestureDetector.getCurrentSpan()/startingSpan; 

     mVelocityTracker.computeCurrentVelocity(1000); 

     Log.d("VELOCITY", "X vel : " + mVelocityTracker.getXVelocity()); 
     Log.d("VELOCITY", "Y vel : " + mVelocityTracker.getYVelocity()); 

     if (scale <= 1.0) { 
      EventBus_Singleton.getInstance().post(new EventBus_Poster("pinched_map", "out")); 
     } else { 
      EventBus_Singleton.getInstance().post(new EventBus_Poster("pinched_map", "in")); 
     } 

     return true; 
    } 
}; 
+0

Решенный для Швета? или кто-то другой принял? давайте узнаем результаты на вашей стороне? – Odaym

+0

Да, он работает для меня так, как мне было нужно, но иногда он иногда перетаскивает карту, так как я хочу, чтобы пользователь ее перетащил. – Shvet

+0

Что вы подразумеваете под ловушкой? действие, которое происходит, когда вы помещаете, например, один палец и начинаете перетаскивать карту слева направо сверху вниз? или панорамирование, когда вы перемещаете камеру на карту вверх и вниз? – Odaym

Смежные вопросы