Чтобы реализовать ваш собственный обработчик масштабирования и добавить слушателя, вам необходимо создать свой подкласс MapView.Сначала давайте создадим интерфейс для OnZoomListener
.Обратите внимание, что вы можете изменить интерфейс в соответствии с вашими потребностями. Ниже приведен просто скелетный код, который вы можете начать с
public interface OnZoomListener {
/***
* /**
* Called when there is a zoom changes
* @param mapView Reference to the current map view
* @param currentZoom The current zoom, set to -1 initially
* @param newZoom The new zoom level
*/
public void onZoomChanged(MapView mapView, int currentZoom, int newZoom);
}
. Теперь вам нужен подкласс, который будет вызывать этот OnZoomListener
при изменении масштаба.,Вот скелетный код для того, что является расширением этого SO Ответа
public class MyMapView extends MapView {
int oldZoomLevel=-1;
OnZoomListener onZoomListener;
public MyMapView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyMapView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyMapView(Context context, String apiKey) {
super(context, apiKey);
}
public void setOnZoomListener(OnZoomListener onZoomListener) {
this.onZoomListener = onZoomListener;
}
@Override
public void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
int newZoom = this.getZoomLevel();
if (newZoom != oldZoomLevel) {
// dispatch the listeners
if(oldZoomLevel != -1 && onZoomListener != null) {
onZoomListener.onZoomChanged(this, oldZoomLevel, newZoom);
}
// update the new zoom level
oldZoomLevel = getZoomLevel();
}
}
}
Теперь вы можете использовать MyMapView
в вашем макете вместо стандартного MapView
.Примечание: пакет кода com.so4729255
- это то, что я использую только для тестирования.
<com.so4729255.MyMapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:apiKey="YOUR API KEY"
android:clickable="true"
/>
И, наконец, добавьте OnZoomListener
в свой код.Приведенный ниже код просто показывает тост для иллюстрации использования, вы можете сделать все, что вам нужно сделать
MyMapView mapView = (MyMapView)this.findViewById(R.id.mapview);
mapView.setOnZoomListener(new OnZoomListener() {
public void onZoomChanged(MapView mapView, int currentZoom,
int newZoom) {
// implement your handler here
Toast t = Toast.makeText(WebViewMain.this, "Zoom has changed from " + currentZoom + " to " +
newZoom, 500);
t.show();
}
});
Что касается вашего второго вопроса, то, как все ответили, вызов MapView.invalidate()
должен перекрасить карту с помощьюего новое состояние, поскольку оно заставит View перерисовываться в документации API