Xamarin.Forms 调用腾讯地图SDK


Xamarin.Forms 调用 腾讯地图SDK

Xamarin.Forms


Xamarin.Forms研究了好一段时间了,最近一直在学习中,想尝试一下调用其他的SDK,就如腾讯地图SDK(申请容易)。

完成此次项目得感谢以下链接:

http://www.cnblogs.com/jtang/p/4698496.html

其他文档参考:

腾讯地图SDK(安卓)文档 这里面有详细的使用过程(当然里面的代码是不适用C#的,不过要从这里下载SDK,也有如何申请Key的过程,请参考阅读)

Xamarin.Forms自定义每个平台的控件文档 里面有如何根据不同的平台条件下,调用其他页面的过程

Xamarin.Android绑定Java库文档 这里面是把其他软件的SDK Jar包转化为 C# DLL的过程,转换了才可用(当然还有看IOS和Windows的,不过博主的手机是安卓,方便调试)

万事具备后,开始调用腾讯地图了。

1、创建一个Cross-Platform项目(Xamarin.Forms模板,PCL项目)博主是Xamarin_Setup 2.3.0.XXX(2017-2-23日晚更新的)版本,如果用VS2017开发,也是这个创建界面,如果是VS2015,而且更新了最新版的Xamarin,也是这个新的创建界面,下一个界面继续选择PCL或SAP;如果是VS2015 而且Xamarn的版本是2.2.X.XXX,就会在第一个界面显示所有的选项,也是选Xamarin Forms Xaml ( Portable Class Labrary )就可以了。
832198-20170225223525210-805869485.png-68.3kB
832198-20170225224112007-872271782.png-31.8kB

2、创建项目后,先生成运行一遍,建议直接用手机调试(没错,博主用的是红米3)。如果这样都不能调试运行成功的话,建议先配置好自己的环境,不然下面做不下了。

832198-20170225224644616-276731730.png-34.1kB

3、右击解决方案,新建一个项目,用来把腾讯地图的jar转换成DLL。

832198-20170225225013195-2018150326.png-73.3kB

4、创建完成后,在腾讯官网下载的SDK里面的libs文件夹里面有相应 .jar文件,添加到Jars文件夹,并且把jar文件的生成操作改为EmbeddedJar。

832198-20170225225313679-1274726783.png-29.2kB

5、右击TencentMapDemo.AndroidJavaBinding项目,点击生成,发现报了一些错误和警告(警告有多少都不用管,不影响调用)

832198-20170225225626335-1882871814.png-51.5kB

6、随便点击第一个错误,会转到 Com.Tencent......MapController.cs,其实错误很明显,就是含有相同的函数名,调用的使用不知道调用哪一个函数。至于这个是为什么,没有深入研究,希望大神能解答一下。好了,我们直接把这个类的所有方法删除,就留下一个空类就好了。

832198-20170225230220538-1545029093.png-43kB

7、右击TencentMapDemo.AndroidJavaBinding项目,点击生成,生成成功后,在当前项目的文件目录里面/bin/debug/,生成了一个DLL,这个就是我们要调用的库。

832198-20170225230410866-1541745819.png-20.1kB

8、右击安卓项目,把刚才的DLL添加到引用里面。

832198-20170225230514288-309987948.png-22.3kB

9、右击Android,打开属性,在 Android清单 里面的权限,勾选以下权限。

832198-20170225233136570-813665285.png-49kB
832198-20170225233324288-1619624022.png-39.9kB

10、在Android项目里,创建一个类:TencentMapRenderer.cs,代码引用参考如下,请注意注释。

832198-20170226010803007-1080176493.png-21.2kB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Android.App;
  6. using Android.Content;
  7. using Android.OS;
  8. using Android.Runtime;
  9. using Android.Views;
  10. using Android.Widget;
  11. using Xamarin.Forms.Platform.Android;
  12. using Xamarin.Forms;
  13. using TencentMapDemo;
  14. using TencentMapDemo.Droid;
  15. using Com.Tencent.Tencentmap.Mapsdk.Map;
  16. using Com.Tencent.Mapsdk.Raster.Model;
  17. //ExportRenderer向自定义渲染器类添加属性以指定它将用于渲染Xamarin.Forms自定义地图。此属性用于向Xamarin.Forms注册自定义渲染器。第一个是用来承载的界面,第二个是要引用的界面
  18. [assembly: ExportRenderer(typeof(MainPage), typeof(TencentMapRenderer))]
  19. namespace TencentMapDemo.Droid
  20. {
  21. public class TencentMapRenderer : PageRenderer
  22. {
  23. /// <summary>
  24. /// 腾讯地图视图
  25. /// </summary>
  26. private MapView mapView;
  27. /// <summary>
  28. /// 布局
  29. /// </summary>
  30. private LinearLayout layout;
  31. protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
  32. {
  33. base.OnElementChanged(e);
  34. if (e.NewElement == null || e.OldElement != null)
  35. {
  36. return;
  37. }
  38. //e.NewElement就是承载的界面,这里就是PCL项目里面的MainPage
  39. var mainPage = e.NewElement as MainPage;
  40. //初始化mapView
  41. mapView = new MapView(this.Context);
  42. mapView.OnCreate(null);
  43. //初始化视图
  44. layout = new LinearLayout(this.Context);
  45. layout.AddView(mapView);
  46. this.AddView(layout);
  47. //这里可以比对以下我们的写法跟腾讯官网里Java写法的区别,可以看出Java里面的属性是set,get前缀,而在C#里面都被隐藏了,直接用C#惯用的属性写法来代替,而方法则还是同样的SetXXX(),GetXXX(),但是Java是camelCasing,C#用PascalCasing写法(博主非常喜欢C#写法,而很讨厌Java的写法 :-))。这些区别,都是Xamarin 里 绑定Java库的转换规则。
  48. #region TencentMap类
  49. //腾讯地图的设置是通过TencentMap类进行设置,可以控制地图的底图类型、显示范围、缩放级别、添加 / 删除marker和图形,此外对于地图的各种回调监听也是绑定到TencentMap。下面是TencentMap类的使用示例:
  50. //获取TencentMap实例
  51. TencentMap tencentMap = mapView.Map;
  52. //设置实时路况开启
  53. tencentMap.TrafficEnabled = true;
  54. //设置地图中心点
  55. tencentMap.SetCenter(new Com.Tencent.Mapsdk.Raster.Model.LatLng(22.500980, 113.057899));
  56. //设置缩放级别
  57. tencentMap.SetZoom(11);
  58. #endregion
  59. #region UiSettings类
  60. //UiSettings类用于设置地图的视图状态,如Logo位置设置、比例尺位置设置、地图手势开关等。下面是UiSettings类的使用示例:
  61. //获取UiSettings实例
  62. UiSettings uiSettings = mapView.UiSettings;
  63. //设置logo到屏幕底部中心
  64. uiSettings.SetLogoPosition(UiSettings.LogoPositionCenterBottom);
  65. //设置比例尺到屏幕右下角
  66. uiSettings.SetScaleViewPosition(UiSettings.ScaleviewPositionRightBottom);
  67. //启用缩放手势(更多的手势控制请参考开发手册)
  68. uiSettings.SetZoomGesturesEnabled(true);
  69. #endregion
  70. #region 使用marker
  71. //注意,这里要往resources/drawable/里添加一个red_location.png的图片
  72. var bitmap = Resources.GetBitmap("red_location.png");
  73. BitmapDescriptor des = new BitmapDescriptor(bitmap);
  74. foreach (var item in mainPage.Options)
  75. {
  76. MarkerOptions options = new MarkerOptions();
  77. options.InvokeIcon(des);
  78. options.InvokeTitle(item.Title);
  79. options.Anchor(0.5f, 0.5f);
  80. options.InvokePosition(new LatLng(item.Lat, item.Lng));
  81. options.Draggable(true);
  82. Marker marker = mapView.AddMarker(options);
  83. marker.ShowInfoWindow();
  84. }
  85. #endregion
  86. }
  87. protected override void OnLayout(bool changed, int l, int t, int r, int b)
  88. {
  89. base.OnLayout(changed, l, t, r, b);
  90. var msw = Android.Views.View.MeasureSpec.MakeMeasureSpec(r - l, MeasureSpecMode.Exactly);
  91. var msh = Android.Views.View.MeasureSpec.MakeMeasureSpec(b - t, MeasureSpecMode.Exactly);
  92. layout.Measure(msw, msh);
  93. layout.Layout(0, 0, r - l, b - t);
  94. }
  95. }
  96. }

11、在Andriod项目,双击打开Properties里的AndroidManifest.xml,在里添加在腾讯申请的Key(如果不添加,则会在地图中,有一个警告文字出现)

  1. <meta-data android:name="TencentMapSDK" android:value="你申请的Key"/>

12、在PCL项目里,修改App.xaml,代码如下:
832198-20170226011107929-1475078801.png-83.9kB

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
  4. xmlns:local="clr-namespace:TencentMapDemo"
  5. x:Class="TencentMapDemo.MainPage"
  6. Title="腾讯地图调用Demo">
  7. <!--这里把默认的Label删除-->
  8. </ContentPage>
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Xamarin.Forms;
  7. namespace TencentMapDemo
  8. {
  9. public partial class MainPage : ContentPage
  10. {
  11. public IEnumerable<Option> Options;
  12. public MainPage()
  13. {
  14. InitializeComponent();
  15. }
  16. }
  17. /// <summary>
  18. /// 标记类
  19. /// </summary>
  20. public class Option
  21. {
  22. /// <summary>
  23. /// 标题
  24. /// </summary>
  25. public string Title { get; set; }
  26. /// <summary>
  27. /// 纬度
  28. /// </summary>
  29. public double Lat { get; set; }
  30. /// <summary>
  31. /// 经度
  32. /// </summary>
  33. public double Lng { get; set; }
  34. }
  35. }

14、最后生成并调试,效果如下:

832198-20170226012104960-1655020840.png-935.3kB

作者:指尖上的艺术
原文地址:http://www.cnblogs.com/loda7023link/p/6443225.html

分享到