osmdroid API解读(三)

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);//长按触发
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值