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

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

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?

Ответ 1

Ну, я обнаружил, что при попытке сделать это успешное масштабирование сжимается с помощью как скорости, так и шкалы. Скорость измеряется, чтобы определить, действительно ли вы хотите увеличить масштаб, в зависимости от того, насколько быстро вы сдвинули два пальца или ближе друг к другу, вы можете попробовать это внутри Карт 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;
    }
};