首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测安卓MapView是否被平移或缩放?

如何检测安卓MapView是否被平移或缩放?
EN

Stack Overflow用户
提问于 2010-02-25 02:54:20
回答 6查看 9.7K关注 0票数 19

我正在创建一个Android应用程序,它根据MapView的可见区域搜索项目。有没有办法在我的MapView上设置侦听器来检测地图何时被平移或缩放?

EN

回答 6

Stack Overflow用户

发布于 2011-03-24 17:01:12

试试mapview-overlay-manager,它是overlayer for android地图的一个扩展,

它有一些简化的OnGestureListener,几个例子:

代码语言:javascript
复制
onSingleTap(MotionEvent, ManagedOverlay, GeoPoint, OverlayItem)

onDoubleTap(MotionEvent, ManagedOverlay, GeoPoint, OverlayItem)

onLongPress(MotionEvent, ManagedOverlay, GeoPoint, OverlayItem)

onZoom(ZoomEvent, ManagedOverlay)

onScrolled(...)

链接:http://code.google.com/p/mapview-overlay-manager/希望它能有所帮助

票数 4
EN

Stack Overflow用户

发布于 2012-03-02 20:47:42

您可以创建一个扩展MapView的SimpleMapView。

代码语言:javascript
复制
public class SimpleMapView extends MapView {

    private int currentZoomLevel = -1;
    private GeoPoint currentCenter;
    private List<ZoomChangeListener> zoomEvents = new ArrayList<ZoomChangeListener>();
    private List<PanChangeListener> panEvents = new ArrayList<PanChangeListener>();

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

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

    public SimpleMapView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    /**
     * 
     * @return
     */
    public int[][] getBounds() {

        GeoPoint center = getMapCenter();
        int latitudeSpan = getLatitudeSpan();
        int longtitudeSpan = getLongitudeSpan();
        int[][] bounds = new int[2][2];

        bounds[0][0] = center.getLatitudeE6() - (latitudeSpan / 2);
        bounds[0][1] = center.getLongitudeE6() - (longtitudeSpan / 2);

        bounds[1][0] = center.getLatitudeE6() + (latitudeSpan / 2);
        bounds[1][1] = center.getLongitudeE6() + (longtitudeSpan / 2);
        return bounds;
    }

    public boolean onTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_UP) {
            GeoPoint centerGeoPoint = this.getMapCenter();
            if (currentCenter == null || 
                    (currentCenter.getLatitudeE6() != centerGeoPoint.getLatitudeE6()) ||
                    (currentCenter.getLongitudeE6() != centerGeoPoint.getLongitudeE6()) ) {
                firePanEvent(currentCenter, this.getMapCenter());
            }
            currentCenter = this.getMapCenter();
        }
        return super.onTouchEvent(ev);
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        if(getZoomLevel() != currentZoomLevel){
            fireZoomLevel(currentZoomLevel, getZoomLevel());
            currentZoomLevel = getZoomLevel();
        }
    }

    @Override
    public void setSatellite(boolean on){
        super.setSatellite(on);
    }

    @Override
    public MapController getController(){
        return super.getController();
    }

    private void fireZoomLevel(int old, int current){
        for(ZoomChangeListener event : zoomEvents){
            event.onZoom(old, current);
        }
    }

    private void firePanEvent(GeoPoint old, GeoPoint current){
        for(PanChangeListener event : panEvents){
            event.onPan(old, current);
        }
    }

    public void addZoomChangeListener(ZoomChangeListener listener){
        this.zoomEvents.add(listener);
    }

    public void addPanChangeListener(PanChangeListener listener){
        this.panEvents.add(listener);
    }
}

您有监听器,您可以将代码放入平移或缩放。然后在您的xml中:

代码语言:javascript
复制
 <com.androidnatic.maps.SimpleMapView android:clickable="true" 
                    android:layout_height="match_parent" android:id="@+id/mapView" 
                    android:layout_width="match_parent"
                     android:apiKey="xxx">
 </com.androidnatic.maps.SimpleMapView>

然后,您可以在代码中指定平移侦听器:

代码语言:javascript
复制
mapView.addPanChangeListener(new PanChangeListener() {

            @Override
            public void onPan(GeoPoint old, GeoPoint current) {
                          //TODO
                        }
        });
票数 3
EN

Stack Overflow用户

发布于 2011-07-15 00:55:57

遗憾的是,在MapView工具中没有内置的功能来完成这项工作(这是一个奇怪的疏忽,因为JavaScript SDK和iOS SDK中都有此功能)。

不过,通过使用Runnable并仅轮询MapView,您可以很容易地处理此问题。我通过跟踪的“最后”状态来做到这一点:

代码语言:javascript
复制
getLatitudeSpan();
getLongitudeSpan();
getCenter();
getZoomLevel();

然后将它们与当前值进行比较。如果的值发生更改,则表明地图视图已移动。否则,您将无能为力。

无论采用哪种方法,都可以在500ms左右之后重新安排runnable运行另一次,然后重复该过程。您可以使用onResume()和onPause()删除Runnable的回调,并在必要时重新启动它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2328650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档