我想在我的MapView上使用onZoomListener。 下面的代码就是我所做的。它会记录是否点按了缩放按钮。由于所有新手机现在都支持缩放,这是没用的。有没有人知道如何真正做onZoomListener?感谢。
OnZoomListener listener = new OnZoomListener() {
@Override
public void onVisibilityChanged(boolean arg0) {
// TODO Auto-generated method stub
}
@Override
public void onZoom(boolean arg0) {
Log.d(TAG, "ZOOM CHANGED");
// TODO Auto-generated method stub
}
};
ZoomButtonsController zoomButton = mapView.getZoomButtonsController();
zoomButton.setOnZoomListener(listener);
答案 0 :(得分:25)
我必须继承MapView并覆盖dispatchDraw
以下是代码:
int oldZoomLevel=-1;
@Override
public void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (getZoomLevel() != oldZoomLevel) {
Log.d(TAG, "ZOOOMED");
oldZoomLevel = getZoomLevel();
}
}
这个博客给了我很多帮助:http://pa.rezendi.com/2010/03/responding-to-zooms-and-pans-in.html
以上作品很棒。有没有更简单的解决方案? 我尝试直接在MapView上实现onTouchListener,但如果onTouchListener返回false,则只会检测一次触摸事件。如果它返回true,则每次都会检测到触摸,但是地图缩放和平移将不起作用。
答案 1 :(得分:11)
我将上面的所有代码放在一起并提出了这个类:
package at.blockhaus.wheels.map;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
public class CustomMapView extends MapView {
private int oldZoomLevel = -1;
private GeoPoint oldCenterGeoPoint;
private OnPanAndZoomListener mListener;
public CustomMapView(Context context, String apiKey) {
super(context, apiKey);
}
public CustomMapView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomMapView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setOnPanListener(OnPanAndZoomListener listener) {
mListener = listener;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP) {
GeoPoint centerGeoPoint = this.getMapCenter();
if (oldCenterGeoPoint == null ||
(oldCenterGeoPoint.getLatitudeE6() != centerGeoPoint.getLatitudeE6()) ||
(oldCenterGeoPoint.getLongitudeE6() != centerGeoPoint.getLongitudeE6()) ) {
mListener.onPan();
}
oldCenterGeoPoint = this.getMapCenter();
}
return super.onTouchEvent(ev);
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (getZoomLevel() != oldZoomLevel) {
mListener.onZoom();
oldZoomLevel = getZoomLevel();
}
}
}
和相应的监听器接口:
package at.blockhaus.wheels.map;
public interface OnPanAndZoomListener {
public void onPan();
public void onZoom();
}
答案 2 :(得分:1)
也许有点晚了,但你尝试过使用OnOverlayGestureListener吗?
http://code.google.com/p/mapview-overlay-manager/wiki/OnOverlayGestureListener
答案 3 :(得分:0)
编辑:我相信你发现的可能是允许这种检测的唯一机制。 (编辑我的帖子以删除错误信息)扩展MapView并覆盖onDraw()方法将起作用。要做的一个考虑因素是触发缩放代码的频率。例如,在缩放onDraw时可能会被调用数十次,每次都有不同的缩放级别。如果您的听众每次都在开火,这可能会导致性能不佳。您可以通过确定已发生缩放更改来限制此操作,然后在触发事件之前等待两次后续重绘时的缩放级别相同。这一切都取决于您希望如何调用代码。
答案 4 :(得分:0)
使用dispatchTouch()方法检测地图上的触摸事件,并确保调用super()方法执行默认的地图触摸功能。 (如果从函数返回true,设置onTouchListener将禁用内置事件,如缩放和平移,如果返回false,则仅触摸一次触摸。)
在dispatchTouch方法中,您可以使用event.getPointerCount()检查没有触摸点。使用Action_UP通过调用mapview.getZoomLevel()来检测用户是否缩小了;如果您发现缩放级别已更改,则可以执行操作。
答案 5 :(得分:0)
我通过以下方式实现它,它适用于单/多点触控:
@Override
protected void dispatchDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.dispatchDraw(canvas);
if (oldZoomLevel == -1) {
oldZoomLevel = getZoomLevel();
}
if (oldZoomLevel < getZoomLevel()) {
System.out.println("zoomed in");
if (mOnZoomInListener != null) {
mOnZoomInListener
.onZoomedIn(this, oldZoomLevel, getZoomLevel());
}
}
if (oldZoomLevel > getZoomLevel()) {
System.out.println("zoomed out");
if (mOnZoomOutListener != null) {
mOnZoomOutListener.onZoomedOut(this, oldZoomLevel,
getZoomLevel());
}
}
它对我有用!
答案 6 :(得分:0)
尝试通过此方法
map.setMapListener(new MapListener()
{
....
@Override
public boolean onZoom(ZoomEvent event)
{
return false;
}
});
答案 7 :(得分:-7)
MapView提供支持捏合的内置缩放控件。
如果它无法使用,您可以尝试设置mapView.setBuiltInZoomControls(true);
这样您就不需要OnZoomListener。