osmdroid API解读(三)
osmdroid-android模块 org.osmdroid.events包
1.MapEvent接口
地图中的事件,主要有平移、滚动两种事件
//地图事件
public interface MapEvent {
}
1.1 ScrollEvent滚动事件
public class ScrollEvent implements MapEvent {
protected MapView source;
protected int x;
protected int y;
public ScrollEvent(final MapView source, final int x, final int y) {
this.source = source;
this.x = x;
this.y = y;
}
/*
* 返回产生事件的地图
*/
public MapView getSource() {
return source;
}
/*
* 返回x坐标滚动到的位置
*/
public int getX() {
return x;
}
/*
* 返回y坐标滚动到的位置
*/
public int getY() {
return y;
}
@Override
public String toString() {
return "ScrollEvent [source=" + source + ", x=" + x + ", y=" + y + "]";
}
}
1.2 ZoomEvent缩放事件
public class ZoomEvent implements MapEvent {
protected MapView source;
protected double zoomLevel;
public ZoomEvent(final MapView source, final double zoomLevel) {
this.source = source;
this.zoomLevel = zoomLevel;
}
/*
* 返回产生事件的地图源
*/
public MapView getSource() {
return source;
}
/*
* 返回缩放等级
*/
public double getZoomLevel() {
return zoomLevel;
}
@Override
public String toString() {
return "ZoomEvent [source=" + source + ", zoomLevel=" + zoomLevel + "]";
}
}
2.MapListener接口
地图事件监听接口,监听以上提到的两种事件
/*
* 接收地图滚动、缩放事件的接口。为了获取地图事件,通过实现这个接口或者继承MapAdapter,然后使用setMapListener注册监听器。
*/
public interface MapListener {
/*
* 当地图移动时触发
*/
public boolean onScroll(ScrollEvent event);
/*
* 当缩放时触发
*/
public boolean onZoom(ZoomEvent event);
}
2.1 MapAdapter
一个接收地图事件的适配器,方法为空,此方法用于便捷的创建监听器对象
public abstract class MapAdapter implements MapListener {
/*
* 当地图移动时触发
*/
@Override
public boolean onScroll(final ScrollEvent event) {
// do nothing
return false;
}
/*
* 当缩放时触发
*/
@Override
public boolean onZoom(final ZoomEvent event) {
// do nothing
return false;
}
}
2.2 DelayedMapListener
MapListener可能同时接受多个事件,当一个事件到达后,如果另一个事件在delay事件内到达,原来的事件会被放弃。否则,事件会被传播到封装的MapListener。注意这个类不具有线程安全
public class DelayedMapListener implements MapListener {
/** 默认delay时间 */
protected static final int DEFAULT_DELAY = 100;
/** 封装的监听器 */
MapListener wrappedListener;
/** 正在delay的时间 */
protected long delay;
protected Handler handler;
protected CallbackTask callback;
/*
* @param 封装的监听器
*
* @param delay 等待时间
*/
public DelayedMapListener(final MapListener wrappedListener, final long delay) {
this.wrappedListener = wrappedListener;
this.delay = delay;
this.handler = new Handler();
this.callback = null;
}
public DelayedMapListener(final MapListener wrappedListener) {
this(wrappedListener, DEFAULT_DELAY);
}
@Override
public boolean onScroll(final ScrollEvent event) {
dispatch(event);
return true;
}
@Override
public boolean onZoom(final ZoomEvent event) {
dispatch(event);
return true;
}
/*
* 处理到来的事件
*/
protected void dispatch(final MapEvent event) {
// cancel any pending callback
if (callback != null) {
handler.removeCallbacks(callback);
}
callback = new CallbackTask(event);
// set timer
handler.postDelayed(callback, delay);
}
//回调任务
private class CallbackTask implements Runnable {
private final MapEvent event;
public CallbackTask(final MapEvent event) {
this.event = event;
}
@Override
public void run() {
// do the callback
if (event instanceof ScrollEvent) {
wrappedListener.onScroll((ScrollEvent) event);
} else if (event instanceof ZoomEvent) {
wrappedListener.onZoom((ZoomEvent) event);
} else {
// unknown event; discard
Log.d(IMapView.LOGTAG,"Unknown event received: " + event);
}
}
}
}
3.MapEventsReceiver接口
/**
* 处理MapEventsOverlay中的地图事件接口
*/
public interface MapEventsReceiver {
boolean singleTapConfirmedHelper(GeoPoint p);//单击触发
boolean longPressHelper(GeoPoint p);//长按触发
}