На зум событие для карт Google на Android - PullRequest
38 голосов
/ 06 января 2010

Мы создаем приложение, использующее API Google Maps для Android.

У меня есть MapController и MapView, и я включаю встроенные элементы управления масштабированием, используя:

mapView.setBuiltInZoomControls(true);

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

Обновление

mapView.getZoomControls () устарела.И документация предлагает вместо этого использовать mapView.setBuiltInZoomControls (bool).Это нормально, но я просто не могу понять, как действовать на события из встроенных элементов управления зумом.

Ответы [ 11 ]

38 голосов
/ 24 февраля 2013

С Google Maps Android API v2 вы можете использовать GoogleMap.OnCameraChangeListener , например:

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {

    private float currentZoom = -1;

    @Override
    public void onCameraChange(CameraPosition pos) {
        if (pos.zoom != currentZoom){
            currentZoom = pos.zoom;
            // do you action here
        }
    }
});
25 голосов
/ 18 марта 2011

Вы можете реализовать свой собственный базовый "опрос" значения масштабирования, чтобы определить, когда масштаб был изменен, с помощью Android Handler .

Использование следующего кода для вашего запускаемого события . Это где ваша обработка должна быть сделана.

private Handler handler = new Handler();

public static final int zoomCheckingDelay = 500; // in ms

private Runnable zoomChecker = new Runnable()
{
    public void run()
    {
        checkMapIcons();

        handler.removeCallbacks(zoomChecker); // remove the old callback
        handler.postDelayed(zoomChecker, zoomCheckingDelay); // register a new one
    }
};

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

protected void onResume()
{
    super.onResume();
    handler.postDelayed(zoomChecker, zoomCheckingDelay);
}

и остановите , когда вы выходите из игры, используя

protected void onPause()
{
    super.onPause();
    handler.removeCallbacks(zoomChecker); // stop the map from updating
}

Артикул на основе этого можно найти здесь , если вы хотите более длинную запись.

7 голосов
/ 16 марта 2011

Я использую эту библиотеку, у которой есть слушатель функции onZoom. http://code.google.com/p/mapview-overlay-manager/. Хорошо работает.

5 голосов
/ 07 января 2010

Как сказал OP, используйте onUserInteractionEvent и выполните тест самостоятельно.

4 голосов
/ 14 мая 2012

Вот чистое решение. Просто добавьте этот закрытый класс TouchOverlay в вашу деятельность и метод с именем onZoom (который вызывается этим внутренним классом).

Обратите внимание, что вам нужно добавить этот TouchOverlay на вашу карту, например,

mapView.getOverlays().add(new TouchOverlay());

Отслеживает уровень масштабирования всякий раз, когда пользователь касается карты, например, дважды нажмите или ущипните масштабирование, а затем запускает метод onZoom (с уровнем масштабирования), если уровень масштабирования изменяется.

   private class TouchOverlay extends com.google.android.maps.Overlay {
            int lastZoomLevel = -1;

            @Override
            public boolean onTouchEvent(MotionEvent event, MapView mapview) {
                if (event.getAction() == 1) {
                    if (lastZoomLevel == -1)
                        lastZoomLevel = mapView.getZoomLevel();

                    if (mapView.getZoomLevel() != lastZoomLevel) {
                        onZoom(mapView.getZoomLevel());
                        lastZoomLevel = mapView.getZoomLevel();
                    }
                }
                return false;
            }
        }

        public void onZoom(int level) {
            reloadMapData(); //act on zoom level change event here
        }
4 голосов
/ 23 июня 2010

Вы можете использовать

ZoomButtonsController zoomButton = mapView.getZoomButtonsController();
zoomButton.setOnZoomListener(listener);

надеюсь, это поможет

4 голосов
/ 06 января 2010

Android-API предлагает использовать ZoomControls , у которого есть setOnZoomInClickListener ()

Чтобы добавить эти элементы управления масштабированием, вы должны:

ZoomControls mZoom = (ZoomControls) mapView.getZoomControls();

А затем добавьте mZoom в свой макет.

3 голосов
/ 17 марта 2012

Я думаю, что может быть другой ответ на этот вопрос. Метод рисования класса Overlay вызывается после любого масштабирования, и я считаю, что он вызывается после изменения уровня масштабирования. Не могли бы вы создать свое приложение, чтобы воспользоваться этим? Вы даже можете использовать фиктивное наложение, чтобы обнаружить это, если хотите. Разве это не будет более эффективным, чем использование работающего с задержкой?

@Override
public boolean draw (Canvas canvas, MapView mapView, boolean shadow, long when) {
    int zoomLevel = mapView.getZoomLevel();
    // do what you want with the zoom level
    return super.draw(canvas, mapView, shadow, when);
}
2 голосов
/ 07 февраля 2014

Для pre-V2.0 я создал класс, который расширяет MapView, который предупреждает слушателя о событиях, когда область карты начинает изменяться (onRegionBeginChange) и перестает изменяться (onRegionEndChange).

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;

public class ExMapView extends MapView {
    private static final String TAG = ExMapView.class.getSimpleName();
    private static final int DURATION_DEFAULT = 700;

    private OnRegionChangedListener onRegionChangedListener;
    private GeoPoint previousMapCenter;
    private int previousZoomLevel;
    private int changeDuration; // This is the duration between when the user stops moving the map around and when the onRegionEndChange event fires.
    private boolean isTouched = false;
    private boolean regionChanging = false;

    private Runnable onRegionEndChangeTask = new Runnable() {
        public void run() {
            regionChanging = false;
            previousMapCenter = getMapCenter();
            previousZoomLevel = getZoomLevel();
            if (onRegionChangedListener != null) {
                onRegionChangedListener.onRegionEndChange(ExMapView.this, previousMapCenter, previousZoomLevel);
            }
        }
    };

    public ExMapView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ExMapView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public ExMapView(Context context, String apiKey) {
        super(context, apiKey);
        init();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        isTouched = event.getAction() != MotionEvent.ACTION_UP;
        return super.onTouchEvent(event);
    }

    @Override
    public void computeScroll() {
        super.computeScroll();

        // If the map region is still changing (user is still scrolling or zooming), reset timer for onRegionEndChange.
        if ((!isTouched && !getMapCenter().equals(previousMapCenter)) || (previousZoomLevel != getZoomLevel())) {

            // If the region has just begun changing, fire off onRegionBeginChange event.
            if (!regionChanging) {
                regionChanging = true;
                if (onRegionChangedListener != null) {
                    onRegionChangedListener.onRegionBeginChange(this, previousMapCenter, previousZoomLevel);
                }
            }

            // Reset timer for onRegionEndChange.
            removeCallbacks(onRegionEndChangeTask);
            postDelayed(onRegionEndChangeTask, changeDuration);
        }
    }

    private void init() {
        changeDuration = DURATION_DEFAULT;
        previousMapCenter = getMapCenter();
        previousZoomLevel = getZoomLevel();
    }

    public void setOnRegionChangedListener(OnRegionChangedListener listener) {
        onRegionChangedListener = listener;
    }

    public void setChangeDuration(int duration) {
        changeDuration = duration;
    }

    public interface OnRegionChangedListener {
        public abstract void onRegionBeginChange(ExMapView exMapView, GeoPoint geoPoint, int zoomLevel);
        public abstract void onRegionEndChange(ExMapView exMapView, GeoPoint geoPoint, int zoomLevel);
    }
}
2 голосов
/ 27 августа 2010

U может иметь Zoom CControl следующим образом.

Здесь я прилагаю код, как вы можете реализовать zoomcontrol.

1 >> Файл XML должен быть таким.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">

    <com.google.android.maps.MapView 
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="0l4sCTTyRmXTNo7k8DREHvEaLar2UmHGwnhZVHQ"
        />

    <LinearLayout android:id="@+id/zoom" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_centerHorizontal="true" 
        /> 

</RelativeLayout>

2 >> На вашей основной деятельности внутри метода oncreate выполните следующие действия. здесь вы расширяете свой взгляд с mapView

mapView = (MapView) findViewById(R.id.mapView);
        LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);  
        View zoomView = mapView.getZoomControls(); 

        zoomLayout.addView(zoomView, 
            new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, 
                LayoutParams.WRAP_CONTENT)); 
        mapView.displayZoomControls(true);

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

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

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    MapController mc = mapView.getController(); 
    switch (keyCode) 
    {
        case KeyEvent.KEYCODE_3:
            mc.zoomIn();
            break;
        case KeyEvent.KEYCODE_1:
            mc.zoomOut();
            break;
    }
    return super.onKeyDown(keyCode, event);
}    

.. Вот как я реализовал ...

Thanks..Rakesh

...