как я могу реализовать собственное двойное касание в представлении карты?

Я работал над автономной картой с помощью OSMdroid.

У меня есть фрагменты карты двух уровней масштабирования, а именно 12 и 15.

Теперь обычный двойной тап увеличивает карту на 1 уровень.

То, что я пытаюсь сделать, это setZoomLevel() как 15 после того, как пользователь дважды нажмет на карту,

Является ли это возможным?

Я пытался использовать onGestureListener , но почему-то не работает

Любые подсказки или подсказки в этом направлении или примеры кодов будут большой помощью, спасибо.


person Pratik Bhat    schedule 04.01.2012    source источник


Ответы (4)


У меня было аналогичное требование с Osmdroid MapView в том смысле, что я не хотел, чтобы он выполнял «центрирование в месте двойного касания и масштабирование» по умолчанию. Я хотел, чтобы всплывал тост. В моем случае у меня было наложение поверх MapView, поэтому я просто заставил наложение использовать двойное касание в своем методе onDoubleTap. Для ваших целей вы можете просто добавить наложение, которое ничего не рисует, но имеет собственную функцию двойного нажатия.

Таким образом, в конце вашего onCreate вы можете добавить оверлей. Это маленькое приложение, похоже, демонстрирует то, что вы хотите (вам нужно будет добавить условный код для проверки уровня масштабирования и других действий):

public class OsmdroidDemoMap extends Activity {

    private MapView         mMapView;
    private MapController   mMapController;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.osm_main);
        mMapView = (MapView) findViewById(R.id.mapview);
        mMapView.setTileSource(TileSourceFactory.MAPNIK);
        mMapView.setBuiltInZoomControls(true);
        mMapController = mMapView.getController();
        mMapController.setZoom(13);
        GeoPoint gPt = new GeoPoint(51500000, -150000);
        mMapController.setCenter(gPt);
        DummyOverlay dumOverlay = new DummyOverlay(this);
        List<Overlay> listOfOverlays = mMapView.getOverlays();
        listOfOverlays.clear();
        listOfOverlays.add(dumOverlay);
    }

    public class DummyOverlay extends org.osmdroid.views.overlay.Overlay {

        public DummyOverlay(Context ctx) {
            super(ctx); // TODO Auto-generated constructor stub
        }

        @Override
        protected void draw(Canvas c, MapView osmv, boolean shadow) {}

        @Override
        public boolean onDoubleTap(MotionEvent e, MapView mapView) {
            // This stops the 'jump to, and zoom in' of the default behaviour
            int zoomLevel = mMapView.getZoomLevel();
            mMapController.setZoom(zoomLevel + 3);
            return true;// This stops the double tap being passed on to the mapview
        }
    }
person NickT    schedule 04.01.2012
comment
Этот DummyOverlay представляет собой прозрачное наложение размером со всю карту? Я пытался обнаружить щелчок по маркеру DirectedLocationOverlay - означает ли это, что я должен сам реализовать щелчок внутри маркера? - person David Doria; 16.09.2013

Если вам нужно управлять двойным нажатием в MapView, я предлагаю вам проверить эту тему:

карты Android: как долго щелкать карту?

Вы можете увидеть мой ответ и то, как я адаптировал mapview-overlay-manager.

person Enrique Diaz    schedule 04.01.2012

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

ZoomControls zoomControls = (ZoomControls)findViewById(R.id.zoomControl);

View zoomOut = zoomControls.getChildAt(0);
zoomOut.setBackgroundDrawable(getResources().getDrawable(R.drawable.zoom_out_icon));
zoomOut.setPadding(5, 5, 5, 5);

View zoomIn = zoomControls.getChildAt(1);
zoomIn.setBackgroundDrawable(getResources().getDrawable(R.drawable.zoom_in_icon));
zoomIn.setPadding(5, 5, 5, 5);

zoomControls.setOnZoomInClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            mc.zoomIn();
            mapView.invalidate();
        }
});
zoomControls.setOnZoomOutClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            mc.zoomOut();
            mapView.invalidate();
        }
});

теперь вы можете реализовать свой собственный контроль масштабирования

person Pratik    schedule 04.01.2012
comment
Ну, я реализовал элементы управления масштабированием, но двойное касание должно быть реализовано, потому что это тенденция любого пользователя, поэтому я не могу пренебрегать этим для UX. - person Pratik Bhat; 04.01.2012
comment
я понимаю, что ты пытаешься сказать, но в mapview уже есть реализация двойного нажатия по умолчанию, которую я хочу изменить - person Pratik Bhat; 04.01.2012

В последней библиотеке OSMdroid 4.0 встроено автоматическое увеличение масштаба двойным касанием. Но нет ничего лучше, чем управление масштабированием.

person zIronManBox    schedule 20.03.2014