首页 > 代码库 > Android百度地图之自定义绘制功能

Android百度地图之自定义绘制功能

我们可以在地图上绘制各种自定义的图形,包括点、折线、圆、多边形等等,尤其绘制点和折线非常实用,点可以用来标识所处的位置,折线可以用来描述走过的轨迹,结合前面GPS定位功能可以做出一些非常有意思的应用,下面应用百度Demo实现绘制的基本功能,代码如下:

Activity:

package com.home;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.baidu.mapapi.map.Geometry;import com.baidu.mapapi.map.Graphic;import com.baidu.mapapi.map.GraphicsOverlay;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.Symbol;import com.baidu.mapapi.map.TextItem;import com.baidu.mapapi.map.TextOverlay;import com.baidu.platform.comapi.basestruct.GeoPoint;/** * 此demo用来展示如何在地图上用GraphicsOverlay添加点、线、多边形、圆 同时展示如何在地图上用TextOverlay添加文字 *  */public class GeometryActivity extends Activity implements OnClickListener {    // 地图相关    private MapView mMapView = null;    private Button resetBtn = null;    private Button clearBtn = null;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_geometry);        CharSequence titleLable = "自定义绘制功能";        setTitle(titleLable);        // 初始化地图        mMapView = (MapView) findViewById(R.id.bmapView);        mMapView.getController().setZoom(12.5f);        mMapView.getController().enableClick(true);        // UI初始化        clearBtn = (Button) findViewById(R.id.btn_clear);        resetBtn = (Button) findViewById(R.id.btn_reset);        clearBtn.setOnClickListener(this);        resetBtn.setOnClickListener(this);        resetBtn.setEnabled(false);        // 界面加载时添加绘制图层        addCustomElementsDemo();    }    @Override    public void onClick(View v) {        if (v == clearBtn) {            clearClick();            clearBtn.setEnabled(false);            resetBtn.setEnabled(true);        }        if (v == resetBtn) {            resetClick();            clearBtn.setEnabled(true);            resetBtn.setEnabled(false);        }    }    /**     * 清除所有图层     */    public void clearClick() {        mMapView.getOverlays().clear();    }    /**     * 添加绘制元素     */    public void resetClick() {        addCustomElementsDemo();    }    /**     * 添加点、线、多边形、圆、文字     */    public void addCustomElementsDemo() {        GraphicsOverlay graphicsOverlay = new GraphicsOverlay(mMapView);        mMapView.getOverlays().add(graphicsOverlay);        // 添加点        graphicsOverlay.setData(drawPoint());        // 添加折线        graphicsOverlay.setData(drawLine());        // 添加多边形        graphicsOverlay.setData(drawPolygon());        // 添加圆        graphicsOverlay.setData(drawCircle());        // 绘制文字        TextOverlay textOverlay = new TextOverlay(mMapView);        mMapView.getOverlays().add(textOverlay);        textOverlay.addText(drawText());        // 执行地图刷新使生效        mMapView.refresh();    }    /**     * 绘制折线,该折线状态随地图状态变化     *      * @return 折线对象     */    public Graphic drawLine() {        double mLat = 39.97923;        double mLon = 116.357428;        int lat = (int) (mLat * 1E6);        int lon = (int) (mLon * 1E6);        GeoPoint pt1 = new GeoPoint(lat, lon);        mLat = 39.94923;        mLon = 116.397428;        lat = (int) (mLat * 1E6);        lon = (int) (mLon * 1E6);        GeoPoint pt2 = new GeoPoint(lat, lon);        mLat = 39.97923;        mLon = 116.437428;        lat = (int) (mLat * 1E6);        lon = (int) (mLon * 1E6);        GeoPoint pt3 = new GeoPoint(lat, lon);        // 构建线        Geometry lineGeometry = new Geometry();        // 设定折线点坐标        GeoPoint[] linePoints = new GeoPoint[3];        linePoints[0] = pt1;        linePoints[1] = pt2;        linePoints[2] = pt3;        lineGeometry.setPolyLine(linePoints);        // 设定样式        Symbol lineSymbol = new Symbol();        Symbol.Color lineColor = lineSymbol.new Color();        lineColor.red = 255;        lineColor.green = 0;        lineColor.blue = 0;        lineColor.alpha = 255;        lineSymbol.setLineSymbol(lineColor, 10);        // 生成Graphic对象        Graphic lineGraphic = new Graphic(lineGeometry, lineSymbol);        return lineGraphic;    }    /**     * 绘制多边形,该多边形随地图状态变化     *      * @return 多边形对象     */    public Graphic drawPolygon() {        double mLat = 39.93923;        double mLon = 116.357428;        int lat = (int) (mLat * 1E6);        int lon = (int) (mLon * 1E6);        GeoPoint pt1 = new GeoPoint(lat, lon);        mLat = 39.91923;        mLon = 116.327428;        lat = (int) (mLat * 1E6);        lon = (int) (mLon * 1E6);        GeoPoint pt2 = new GeoPoint(lat, lon);        mLat = 39.89923;        mLon = 116.347428;        lat = (int) (mLat * 1E6);        lon = (int) (mLon * 1E6);        GeoPoint pt3 = new GeoPoint(lat, lon);        mLat = 39.89923;        mLon = 116.367428;        lat = (int) (mLat * 1E6);        lon = (int) (mLon * 1E6);        GeoPoint pt4 = new GeoPoint(lat, lon);        mLat = 39.91923;        mLon = 116.387428;        lat = (int) (mLat * 1E6);        lon = (int) (mLon * 1E6);        GeoPoint pt5 = new GeoPoint(lat, lon);        // 构建多边形        Geometry polygonGeometry = new Geometry();        // 设置多边形坐标        GeoPoint[] polygonPoints = new GeoPoint[5];        polygonPoints[0] = pt1;        polygonPoints[1] = pt2;        polygonPoints[2] = pt3;        polygonPoints[3] = pt4;        polygonPoints[4] = pt5;        polygonGeometry.setPolygon(polygonPoints);        // 设置多边形样式        Symbol polygonSymbol = new Symbol();        Symbol.Color polygonColor = polygonSymbol.new Color();        polygonColor.red = 0;        polygonColor.green = 0;        polygonColor.blue = 255;        polygonColor.alpha = 126;        polygonSymbol.setSurface(polygonColor, 1, 5);        // 生成Graphic对象        Graphic polygonGraphic = new Graphic(polygonGeometry, polygonSymbol);        return polygonGraphic;    }    /**     * 绘制单点,该点状态不随地图状态变化而变化     *      * @return 点对象     */    public Graphic drawPoint() {        double mLat = 39.98923;        double mLon = 116.397428;        int lat = (int) (mLat * 1E6);        int lon = (int) (mLon * 1E6);        GeoPoint pt1 = new GeoPoint(lat, lon);        // 构建点        Geometry pointGeometry = new Geometry();        // 设置坐标        pointGeometry.setPoint(pt1, 10);        // 设定样式        Symbol pointSymbol = new Symbol();        Symbol.Color pointColor = pointSymbol.new Color();        pointColor.red = 0;        pointColor.green = 126;        pointColor.blue = 255;        pointColor.alpha = 255;        pointSymbol.setPointSymbol(pointColor);        // 生成Graphic对象        Graphic pointGraphic = new Graphic(pointGeometry, pointSymbol);        return pointGraphic;    }    /**     * 绘制圆,该圆随地图状态变化     *      * @return 圆对象     */    public Graphic drawCircle() {        double mLat = 39.90923;        double mLon = 116.447428;        int lat = (int) (mLat * 1E6);        int lon = (int) (mLon * 1E6);        GeoPoint pt1 = new GeoPoint(lat, lon);        // 构建圆        Geometry circleGeometry = new Geometry();        // 设置圆中心点坐标和半径        circleGeometry.setCircle(pt1, 2500);        // 设置样式        Symbol circleSymbol = new Symbol();        Symbol.Color circleColor = circleSymbol.new Color();        circleColor.red = 0;        circleColor.green = 255;        circleColor.blue = 0;        circleColor.alpha = 126;        circleSymbol.setSurface(circleColor, 1, 3);        // 生成Graphic对象        Graphic circleGraphic = new Graphic(circleGeometry, circleSymbol);        return circleGraphic;    }    /**     * 绘制文字,该文字随地图变化有透视效果     *      * @return 文字对象     */    public TextItem drawText() {        double mLat = 39.86923;        double mLon = 116.397428;        int lat = (int) (mLat * 1E6);        int lon = (int) (mLon * 1E6);        // 构建文字        TextItem item = new TextItem();        // 设置文字位置        item.pt = new GeoPoint(lat, lon);        // 设置文件内容        item.text = "百度地图SDK";        // 设文字大小        item.fontSize = 40;        Symbol symbol = new Symbol();        Symbol.Color bgColor = symbol.new Color();        // 设置文字背景色        bgColor.red = 0;        bgColor.blue = 0;        bgColor.green = 255;        bgColor.alpha = 50;        Symbol.Color fontColor = symbol.new Color();        // 设置文字着色        fontColor.alpha = 255;        fontColor.red = 0;        fontColor.green = 0;        fontColor.blue = 255;        // 设置对齐方式        item.align = TextItem.ALIGN_CENTER;        // 设置文字颜色和背景颜色        item.fontColor = fontColor;        item.bgColor = bgColor;        return item;    }    @Override    protected void onPause() {        mMapView.onPause();        super.onPause();    }    @Override    protected void onResume() {        mMapView.onResume();        super.onResume();    }    @Override    protected void onDestroy() {        mMapView.destroy();        super.onDestroy();    }    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        mMapView.onSaveInstanceState(outState);    }    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        super.onRestoreInstanceState(savedInstanceState);        mMapView.onRestoreInstanceState(savedInstanceState);    }}

布局XMl:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <Button            android:id="@+id/btn_clear"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_margin="10dp"            android:layout_weight="1.0"            android:background="@drawable/button_style"            android:text="清除(clear)" />        <Button            android:id="@+id/btn_reset"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_margin="10dp"            android:layout_weight="1.0"            android:background="@drawable/button_style"            android:text="重置(reset)" />    </LinearLayout>    <com.baidu.mapapi.map.MapView        android:id="@+id/bmapView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:clickable="true" /></LinearLayout>

Manifest配置跟前面一样。

附上图片效果:

d6.png

来自:http://blog.csdn.net/u010142437/article/details/11422213

Android百度地图之自定义绘制功能