您的位置:华清远见教育科技集团 >> Android资料 >> Android开发之使用Overlay  
 
Android开发之使用Overlay
分享到:

通过在MapView上添加覆盖层,可以在指定的位置上添加注解、绘制图像等。Google地图上可以加入多个覆盖层,所有覆盖层均都在地图图层之上,每个覆盖层均可以对用户的点击事件做出响应。

创建覆盖层继承Overlay类的子类,并通过重载draw()方法为指定位置添加注解,重载onTap()方法处理用户的点击操作。

代码清单1所示的代码是创建Overlay的小代码集合。

代码清单1 创建Overlay


public class TextOverlay extends Overlay {
        //draw()中传入的参数中,shadow变量是用来区分绘制图层的:false表示在覆盖层上进行绘制;true则表示在隐藏层上进行绘制
        @Override
        public void draw(Canvas canvas, MapView mapView, boolean shadow) {
            if (shadow == false){

            }
            else{
            }
            super.draw(canvas, mapView, shadow);
        }

        //onTap()方法的返回值:返回false表示覆盖层不处理点击事件;返回true则表示已经处理了点击事件
        @Override
        public boolean onTap(GeoPoint p, MapView mapView) {
            return false;
        }
    }

在覆盖层绘制图形或文字需要使用“画布”(Canvas)来实现,绘制的位置是屏幕坐标,这就需要将地图上的物理坐标与屏幕坐标进行转换;Projection类提供了物理坐标和屏幕坐标的转换功能,可在经度和纬度表示的GeoPoint点和屏幕上Point点进行转换,toPixels()方法将物理坐标转换为屏幕坐标,fromPixels()方法将屏幕坐标转换为物理坐标。

两个方法的具体使用方法可以参考代码清单2所示的代码。

代码清单2 物理坐标和屏幕坐标的转换


Projection projection = mapView.getProjection();

    projection.toPixels(geoPoint, point);
    projection.fromPixels(point.x, point.y);

以下内容以MapOverlayDemo示例,说明如何在Google地图上添加覆盖层,并在预订的物理坐标上显示提示信息。图1是MapOverlayDemo示例的运行结果。


图1 MapOverlayDemo示例的运行结果

TextOverlay类是MapOverlayDemo示例的覆盖层,主要重载了draw()方法,在指定的物理坐标上绘制了标记点和提示文字。TextOverlay.java文件的核心代码如代码清单3所示。

代码清单3 TextOverlay.java核心代码


public class TextOverlay extends Overlay {
        //定义了绘制半径变量mRadius,供定义绘制范围使用
        private final int mRadius = 5;

        @Override
        public void draw(Canvas canvas, MapView mapView, boolean shadow) {
            Projection projection = mapView.getProjection();

            if (shadow == false){
                Double lng = 116.391483 * 1E6;
                Double lat = 39.9055472 * 1E6;

                GeoPoint geoPoint = new GeoPoint(lat.intValue(), lng.intValue());

                Point point = new Point();
                //使用Projection完成了从物理坐标到屏幕坐标的转换
                projection.toPixels(geoPoint, point);

                //oval设定标记点的大小
                RectF oval = new RectF(point.x - mRadius, point.y - mRadius, point.x + mRadius, point.y + mRadius);

                Paint paint = new Paint();
                //设置了绘制颜色
                paint.setARGB(250, 250, 0, 0);
                //开启了平滑设置,防止文字出现锯齿
                paint.setAntiAlias(true);
                paint.setFakeBoldText(true);

                //绘制了圆形的标记点
                canvas.drawOval(oval, paint);
                //绘制了提示文字,第2个和第3个参数是绘制屏幕的x坐标和y坐标
                canvas.drawText("标记点", point.x+2*mRadius, point.y, paint);
            }
            super.draw(canvas, mapView, shadow);
        }

        @Override
        public boolean onTap(GeoPoint p, MapView mapView) {
            return false;
        }
    }

建立了覆盖层后,还需要把覆盖层添加到MapView上。MapOverlayDemo.java的核心代码如代码清单4所示。

代码清单4 MapOverlayDemo.java的核心代码


public class MapOverlayDemo extends MapActivity {
        private MapView mapView;
        private MapController mapController;
        private TextOverlay textOverlay;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            mapView = (MapView)findViewById(R.id.mapview);
            mapController = mapView.getController();

            Double lng = 126.676530486 * 1E6;
            Double lat = 45.7698895661 * 1E6;
            GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue());

            mapController.setCenter(point);
            mapController.setZoom(11);
            mapController.animateTo(point);

            //实例化了TextOverlay对象
            textOverlay = new TextOverlay();
            //获取MapView已有的覆盖层
            List<Overlay> overlays = mapView.getOverlays();
            //将TextOverlay对象添加到MapView中
            overlays.add(textOverlay);
        }

        @Override
        protected boolean isRouteDisplayed() {
            return false;
        }
    }

 更多相关文章

·Android Overlay硬件加速
·Android开发之使用Google地图
·Android开发之Google地图应用
·Android开发之GPS定位
·Android开发之Android Location API