zoukankan      html  css  js  c++  java
  • 【Android】3.6 地图基本控制方法

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

    一、简介

    文件名:Demo05MapControl.cs

    简介:介绍平移和缩放地图,双指操作地图,监听地图点击事件

    详述:

    (1)介绍地图缩放级别、旋转度和俯视度的get和set方法;

    (2)监听单击和长按地图事件;

    (3)单击、双击和长按地图获取该点的经纬度坐标;

    (4)对地图显示内容进行截图,截图保存地址为:/mnt/sdcard/test.png;

    运行截图

    在x86模拟器中的运行效果如下:

    image

    二、设计步骤

    1、添加demo06_mapcontrol.axml

    在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="50dip"
            android:orientation="horizontal" >
    
            <Button
                android:id="@+id/zoombutton"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="缩放" />
    
            <EditText
                android:id="@+id/zoomlevel"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="10" />
    
            <Button
                android:id="@+id/rotatebutton"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="旋转" />
    
            <EditText
                android:id="@+id/rotateangle"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="90" />
    
            <Button
                android:id="@+id/overlookbutton"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="俯视" />
    
            <EditText
                android:id="@+id/overlookangle"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="-30" />
        </LinearLayout>
    
        <TextView
            android:id="@+id/state"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:lines="3"
            android:text="点击、长按、双击地图以获取经纬度和地图状态" />
    
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >
    
            <com.baidu.mapapi.map.TextureMapView
                android:id="@+id/bmapView"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:clickable="true" />
    
            <Button
                android:id="@+id/savescreen"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:layout_marginTop="10dip"
                android:text="截图" />
        </RelativeLayout>
    
    </LinearLayout>

    2、添加Demo06MapControl.cs

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

    using Android.App;
    using Android.Content.PM;
    using Android.Graphics;
    using Android.OS;
    using Android.Widget;
    using Com.Baidu.Mapapi.Map;
    using Com.Baidu.Mapapi.Model;
    using System.IO;
    
    namespace BdMapV371Demos.SrcSdkDemos
    {
        /// <summary>
        /// 演示地图缩放,旋转,视角控制
        /// </summary>
        [Activity(Label = "@string/demo_name_control",
            ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
            ScreenOrientation = ScreenOrientation.Sensor)]
        public class Demo06MapControl : Activity,
            BaiduMap.IOnMapClickListener, BaiduMap.IOnMapLongClickListener,
            BaiduMap.IOnMapDoubleClickListener, BaiduMap.IOnMapStatusChangeListener,
            BaiduMap.ISnapshotReadyCallback
        {
            private TextureMapView mMapView;
            private BaiduMap mBaiduMap;
    
            /// <summary>
            /// 当前地点击点
            /// </summary>
            private LatLng currentPt;
    
            private string touchType;
    
            /// <summary>
            /// 用于显示地图状态的面板
            /// </summary>
            private TextView mStateBar;
    
            protected override void OnCreate(Bundle savedInstanceState)
            {
                base.OnCreate(savedInstanceState);
                SetContentView(Resource.Layout.demo06_mapcontrol);
    
                mMapView = FindViewById<TextureMapView>(Resource.Id.bmapView);
                mBaiduMap = mMapView.Map;
                mBaiduMap.SetMapStatus(MapStatusUpdateFactory.NewLatLng(MainActivity.HeNanUniversity));
    
                mStateBar = FindViewById<TextView>(Resource.Id.state);
                mBaiduMap.SetOnMapClickListener(this);
                mBaiduMap.SetOnMapLongClickListener(this);
                mBaiduMap.SetOnMapDoubleClickListener(this);
                mBaiduMap.SetOnMapStatusChangeListener(this);
    
                var btnZoom = FindViewById<Button>(Resource.Id.zoombutton);
                btnZoom.Click += delegate
                {
                    //处理缩放 sdk 缩放级别范围: [3.0, 19.0]
                    EditText t = FindViewById<EditText>(Resource.Id.zoomlevel);
                    try
                    {
                        float zoomLevel = float.Parse(t.Text);
                        MapStatusUpdate u = MapStatusUpdateFactory.ZoomTo(zoomLevel);
                        mBaiduMap.AnimateMapStatus(u);
                    }
                    catch
                    {
                        Toast.MakeText(this, "请输入正确的缩放级别", ToastLength.Short).Show();
                    }
                    UpdateMapState();
                };
    
                var btnRotate = FindViewById<Button>(Resource.Id.rotatebutton);
                btnRotate.Click += delegate
                {
                    //处理旋转。旋转角范围:-180~180 , 单位:度,逆时针旋转
                    EditText t = FindViewById<EditText>(Resource.Id.rotateangle);
                    try
                    {
                        int rotateAngle = int.Parse(t.Text);
                        MapStatus ms = new MapStatus.Builder(mBaiduMap.MapStatus).Rotate(rotateAngle).Build();
                        MapStatusUpdate u = MapStatusUpdateFactory.NewMapStatus(ms);
                        mBaiduMap.AnimateMapStatus(u);
                    }
                    catch
                    {
                        Toast.MakeText(this, "请输入正确的旋转角度", ToastLength.Short).Show();
                    }
                    UpdateMapState();
                };
    
                var btnOverlook = FindViewById<Button>(Resource.Id.overlookbutton);
                btnOverlook.Click += delegate
                {
                    //处理俯视。俯角范围:-45~0, 单位:度
                    EditText t = FindViewById<EditText>(Resource.Id.overlookangle);
                    try
                    {
                        int overlookAngle = int.Parse(t.Text);
                        MapStatus ms = new MapStatus.Builder(mBaiduMap.MapStatus).Overlook(overlookAngle).Build();
                        MapStatusUpdate u = MapStatusUpdateFactory.NewMapStatus(ms);
                        mBaiduMap.AnimateMapStatus(u);
                    }
                    catch
                    {
                        Toast.MakeText(this, "请输入正确的俯角", ToastLength.Short).Show();
                    }
                    UpdateMapState();
                };
    
                var btnSaveScreen = FindViewById<Button>(Resource.Id.savescreen);
                btnSaveScreen.Click += delegate
                {
                    // 截图(在SnapshotReadyCallback中保存图片到sd卡)
                    mBaiduMap.Snapshot(this);
                    Toast.MakeText(this, "正在截取屏幕图片...", ToastLength.Short).Show();
                    UpdateMapState();
                };
            }
    
            #region 实现BaiduMap.IOnMapClickListener接口
            public void OnMapClick(LatLng p0)
            {
                touchType = "单击";
                currentPt = p0;
                UpdateMapState();
            }
    
            public bool OnMapPoiClick(MapPoi p0)
            {
                return false;
            }
            #endregion
    
            #region 实现BaiduMap.IOnMapLongClickListener接口
            public void OnMapLongClick(LatLng p0)
            {
                touchType = "长按";
                currentPt = p0;
                UpdateMapState();
            }
            #endregion
    
            #region 实现BaiduMap.IOnMapDoubleClickListener接口
            public void OnMapDoubleClick(LatLng p0)
            {
                touchType = "双击";
                currentPt = p0;
                UpdateMapState();
            }
            #endregion
    
            #region 实现BaiduMap.IOnMapStatusChangeListener接口
            public void OnMapStatusChange(MapStatus p0)
            {
                UpdateMapState();
            }
    
            public void OnMapStatusChangeFinish(MapStatus p0)
            {
                UpdateMapState();
            }
    
            public void OnMapStatusChangeStart(MapStatus p0)
            {
                UpdateMapState();
            }
            #endregion
    
            #region 实现BaiduMap.ISnapshotReadyCallback接口
            public void OnSnapshotReady(Bitmap p0)
            {
                string file = "/mnt/sdcard/test.png";
                FileStream outX;
                try
                {
                    outX = new FileStream(file, FileMode.Create);
                    if (p0.Compress(
                            Bitmap.CompressFormat.Png, 100, outX))
                    {
                        outX.Flush();
                        outX.Close();
                    }
                    Toast.MakeText(this,
                            "屏幕截图成功,图片保存在: " + file.ToString(),
                            ToastLength.Short).Show();
                }
                catch (FileNotFoundException e)
                {
                    throw e;
                }
                catch (IOException e)
                {
                    throw e;
                }
            }
            #endregion
    
            /// <summary>
            /// 更新地图状态显示面板
            /// </summary>
            private void UpdateMapState()
            {
                if (mStateBar == null)
                {
                    return;
                }
                string state = "";
                if (currentPt == null)
                {
                    state = "点击、长按、双击地图以获取经纬度和地图状态";
                }
                else
                {
                    state = string.Format(touchType + ",当前经度:{0:f6} 当前纬度:{1:f6}",
                            currentPt.Longitude, currentPt.Latitude);
                }
                state += "
    ";
                MapStatus ms = mBaiduMap.MapStatus;
                state += string.Format("zoom={0:f2},rotate={1:d},overlook={2:d}",
                        ms.Zoom, (int)ms.Rotate, (int)ms.Overlook);
                mStateBar.Text = state;
            }
    
            protected override void OnPause()
            {
                mMapView.OnPause();
                base.OnPause();
            }
    
            protected override void OnResume()
            {
                mMapView.OnResume();
                base.OnResume();
            }
    
            protected override void OnDestroy()
            {
                mMapView.OnDestroy();
                base.OnDestroy();
            }
        }
    }

    3、修改MainActivity.cs

    在MainActivity.cs文件的demos字段定义中添加下面的代码。

              //示例6--地图操作功能
                new DemoInfo<Activity>(Resource.String.demo_title_control,
                    Resource.String.demo_desc_control,
                    new Demo06MapControl()),

    运行观察结果。

  • 相关阅读:
    InvokeRequired和Invoke
    DataGrid 得到DataGridRow 和DataGridColumn
    DataGrid 如何得到DataGridRow 和DataGridCell 对象
    安装Extended WPF Toolkit
    WPF DataGrid绑定一个组合列
    允许Root登录Docker ubuntu(MAC主机,使用portainer管理)
    photoshop人物美白教程:暗沉肤色提亮美白
    django中聚合aggregate和annotate GROUP BY的使用方法
    Django Model 基础数据库操作应用
    如何在mac上安装gitlab
  • 原文地址:https://www.cnblogs.com/rainmj/p/5181388.html
Copyright © 2011-2022 走看看