【Android】3.18 示例18--自定义绘制功能

分类:C#、Android、VS2015、百度地图应用; 创建日期:2016-02-04

简介:介绍自定义绘制点、线、多边形、圆等几何图形和文字

详述:

(1)支持绘制凸多边形,如要绘制凹多边形请用三角形进行拼接;

(2)支持绘制文字;

一、运行截图

本示例运行截图如下:

image

二、设计步骤

1、添加Demo18_geometry.xml文件

在layout文件夹下添加该文件,然后将代码改为下面的内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

  <LinearLayout
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:orientation="horizontal" >
    <CheckBox
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1.0"
        android:checked="false"
        android:text="虚线绘制"
        android:id="@+id/dottedline" />

    <Button
        android:id="@+id/btnReset"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="10dip"
        android:layout_marginLeft="10dip"
        android:layout_marginRight="10dip"
        android:layout_marginTop="10dip"
        android:layout_weight="1.0"
        android:text="绘制" />

    <Button
          android:id="@+id/btnClear"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:layout_marginBottom="10dip"
          android:layout_marginLeft="10dip"
          android:layout_marginRight="10dip"
          android:layout_marginTop="10dip"
          android:layout_weight="1.0"
          android:text="清除" />
  </LinearLayout>

  <com.baidu.mapapi.map.TextureMapView
      android:id="@+id/bmapView"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:clickable="true" />

</LinearLayout>

2、添加Demo18Geometry.cs文件

在SrcSdkDemos文件夹下添加该文件,然后将其内容改为下面的代码:

using System.Collections.Generic;
using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Graphics;
using Android.Widget;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Model;
using Java.Lang;
namespace BdMapV371Demos.SrcSdkDemos
{
    /// <summary>
    /// 此demo用来展示如何在地图上用GraphicsOverlay添加点、线、多边形、圆,同时展示如何在地图上用TextOverlay添加文字
    /// </summary>
    [Activity(Label = "@string/demo_name_geometry",
        ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
         ScreenOrientation = ScreenOrientation.Sensor)]
    public class Demo18Geometry : Activity
    {
        TextureMapView mMapView;
        BaiduMap mBaiduMap;
        Polyline mPolyline;
        Polyline mColorfulPolyline;
        Polyline mTexturePolyline;
        BitmapDescriptor mRedTexture = BitmapDescriptorFactory.FromAsset("icon1_road_red_arrow.png");
        BitmapDescriptor mBlueTexture = BitmapDescriptorFactory.FromAsset("icon1_road_blue_arrow.png");
        BitmapDescriptor mGreenTexture = BitmapDescriptorFactory.FromAsset("icon1_road_green_arrow.png");

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.demo18_geometry);

            // 初始化地图
            mMapView = FindViewById<TextureMapView>(Resource.Id.bmapView);
            mBaiduMap = mMapView.Map;

            // UI初始化
            Button resetBtn = FindViewById<Button>(Resource.Id.btnReset);
            resetBtn.Click += delegate
            {
                // 添加绘制元素
                AddCustomElementsDemo();
            };
            Button clearBtn = FindViewById<Button>(Resource.Id.btnClear);
            clearBtn.Click += delegate
            {
                // 清除所有图层
                mMapView.Map.Clear();
            };
            CheckBox dottedline = FindViewById<CheckBox>(Resource.Id.dottedline);
            dottedline.CheckedChange += delegate
            {
                if (mPolyline == null) return;
                if (dottedline.Checked) mPolyline.DottedLine = true;
                else mPolyline.DottedLine = false;
            };
        }

        /// <summary>
        /// 添加点、线、多边形、圆、文字
        /// </summary>
        public void AddCustomElementsDemo()
        {
            // 添加普通折线绘制
            LatLng p1 = new LatLng(39.97923, 116.357428);
            LatLng p2 = new LatLng(39.94923, 116.397428);
            LatLng p3 = new LatLng(39.97923, 116.437428);
            IList<LatLng> points = new List<LatLng>();
            points.Add(p1);
            points.Add(p2);
            points.Add(p3);
            OverlayOptions ooPolyline = new PolylineOptions()
                .InvokeWidth(10)
                .InvokeColor(Color.ParseColor("#AAFF0000").ToArgb())
                .InvokePoints(points);
            mPolyline = (Polyline)mBaiduMap.AddOverlay(ooPolyline);

            // 添加多颜色分段的折线绘制
            LatLng p11 = new LatLng(39.965, 116.444);
            LatLng p21 = new LatLng(39.925, 116.494);
            LatLng p31 = new LatLng(39.955, 116.534);
            LatLng p41 = new LatLng(39.905, 116.594);
            LatLng p51 = new LatLng(39.965, 116.644);
            IList<LatLng> points1 = new List<LatLng>();
            points1.Add(p11);
            points1.Add(p21);
            points1.Add(p31);
            points1.Add(p41);
            points1.Add(p51);
            IList<Integer> colorValue = new List<Integer>();
            colorValue.Add(Integer.ValueOf(Color.ParseColor("#AAFF0000").ToArgb()));
            colorValue.Add(Integer.ValueOf(Color.ParseColor("#AA00FF00").ToArgb()));
            colorValue.Add(Integer.ValueOf(Color.ParseColor("#AA0000FF").ToArgb()));
            OverlayOptions ooPolyline1 = new PolylineOptions()
                .InvokeWidth(10)
                .InvokeColor(Color.ParseColor("#AAFF0000").ToArgb())
                .InvokePoints(points1)
                .ColorsValues(colorValue);
            mColorfulPolyline = (Polyline)mBaiduMap.AddOverlay(ooPolyline1);

            // 添加多纹理分段的折线绘制
            LatLng p111 = new LatLng(39.865, 116.444);
            LatLng p211 = new LatLng(39.825, 116.494);
            LatLng p311 = new LatLng(39.855, 116.534);
            LatLng p411 = new LatLng(39.805, 116.594);
            IList<LatLng> points11 = new List<LatLng>();
            points11.Add(p111);
            points11.Add(p211);
            points11.Add(p311);
            points11.Add(p411);
            IList<BitmapDescriptor> textureList = new List<BitmapDescriptor>();
            textureList.Add(mRedTexture);
            textureList.Add(mBlueTexture);
            textureList.Add(mGreenTexture);
            IList<Integer> textureIndexs = new List<Integer>();
            textureIndexs.Add(Integer.ValueOf(0));
            textureIndexs.Add(Integer.ValueOf(1));
            textureIndexs.Add(Integer.ValueOf(2));
            OverlayOptions ooPolyline11 = new PolylineOptions()
                .InvokeWidth(20)
                .InvokePoints(points11)
                .DottedLine(true)
                .InvokeCustomTextureList(textureList)
                .TextureIndex(textureIndexs);
            mTexturePolyline = (Polyline)mBaiduMap.AddOverlay(ooPolyline11);

            // 添加弧线
            OverlayOptions ooArc = new ArcOptions()
                .InvokeColor(Color.ParseColor("#AA00FF00").ToArgb())
                .InvokeWidth(4)
                .Points(p1, p2, p3);
            mBaiduMap.AddOverlay(ooArc);

            // 添加圆
            LatLng llCircle = new LatLng(39.90923, 116.447428);
            OverlayOptions overlayCircle = new CircleOptions()
                .InvokeFillColor(0x000000FF)
                .InvokeCenter(llCircle)
                .InvokeStroke(new Stroke(15, Color.ParseColor("#AA000000").ToArgb()))
                .InvokeRadius(12400);
            mBaiduMap.AddOverlay(overlayCircle);

            LatLng llDot = new LatLng(39.98923, 116.397428);
            OverlayOptions ooDot = new DotOptions()
                .InvokeCenter(llDot)
                .InvokeRadius(16)
                .InvokeColor(Color.ParseColor("#FF0000FF").ToArgb());
            mBaiduMap.AddOverlay(ooDot);

            // 添加多边形
            LatLng pt1 = new LatLng(39.93923, 116.357428);
            LatLng pt2 = new LatLng(39.91923, 116.327428);
            LatLng pt3 = new LatLng(39.89923, 116.347428);
            LatLng pt4 = new LatLng(39.89923, 116.367428);
            LatLng pt5 = new LatLng(39.91923, 116.387428);
            IList<LatLng> pts = new List<LatLng>();
            pts.Add(pt1);
            pts.Add(pt2);
            pts.Add(pt3);
            pts.Add(pt4);
            pts.Add(pt5);
            OverlayOptions polygon = new PolygonOptions()
                .InvokePoints(pts)
                .InvokeStroke(new Stroke(15, Color.ParseColor("#AA00FF00").ToArgb()))
                .InvokeFillColor(Color.ParseColor("#AAFFFF00").ToArgb());
            mBaiduMap.AddOverlay(polygon);

            // 添加文字
            LatLng t = new LatLng(39.86923, 116.397428);
            OverlayOptions t1 = new TextOptions()
                .InvokeBgColor(Color.ParseColor("#AAFFFF00").ToArgb())
                .InvokeFontSize(54)
                .InvokeFontColor(Color.ParseColor("#FFFF00FF").ToArgb())
                .InvokeText("百度地图SDK")
                .InvokeRotate(-30)
                .InvokePosition(t);
            mBaiduMap.AddOverlay(t1);
        }

        protected override void OnPause()
        {
            mMapView.OnPause();
            base.OnPause();
        }

        protected override void OnResume()
        {
            mMapView.OnResume();
            base.OnResume();
        }

        protected override void OnDestroy()
        {
            mMapView.OnDestroy();
            mRedTexture.Recycle();
            mBlueTexture.Recycle();
            mGreenTexture.Recycle();
            base.OnDestroy();
        }

    }
}

3、修改MainActivity.cs

在MainActivity.cs文件的demos字段定义中,去掉【示例18】下面的注释。

运行观察结果。

posted @ 2016-02-04 15:37  rainmj  阅读(711)  评论(0编辑  收藏  举报