Xamarin.Forms 调用腾讯地图
用Xamarin.Forms 也有一段时间了,跨平台,生成native代码的噱头 天花乱坠的,
其中的坑,只有用过的人才懂。。。
就拿地图来说。。。总不能用google地图吧 于是只能自己想办法了。
首先官网上有篇文章,大家可以看下
首先我们需要做的是 将地图的android sdk转为C#能用的dll ,也就是需要对android sdk做一个binding
由于百度地图及高德地图的api key申请都需要sha1值,个人嫌麻烦,所以选择了腾讯地图,腾讯地图只要api key即可。
1.先创建一个Android Bindings Library项目,命名为TencentMapBinding
2.将腾讯地图官网下载的sdk拖到Jars目录下,并将此jar文件的属性改为EmbeddedJar
3.修改Transforms目录下的Metadata.xml,将MapController类删掉
4.编译
然后再新建一个xamarin.forms项目,命名为MyTencentMap,在Portable中添加地图的页面
public class TencentMapPage : ContentPage {
public static BindableProperty PinsProperty =
BindableProperty.Create<TencentMapPage, IEnumerable>(p => p.Pins, default(IEnumerable));
public IEnumerable Pins {
get {
return (IEnumerable)GetValue(PinsProperty);
}
set {
this.SetValue(PinsProperty, value);
}
}
}
再增加一个类
public class Page1:TencentMapPage {
}
随便弄个实体类,显示数据用
public class UserTaskEntInfo : BaseIntInfo {
public string PsCode { get; set; }
public string BaseInfo { get; set; }
public string ProduceInfo { get; set; }
public string TreatmentInfo { get; set; }
public string DischargeInfo { get; set; }
public string Address { get; set; }
public double? Longitude { get; set; }
public double? Latitude { get; set; }
}
public class BaseIntInfo : BaseInfo<int> {
}
public abstract class BaseInfo<TId> {
/// <summary>
/// 标识
/// </summary>
public TId Id { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
}
App.cs文件中添加如下代码:
public App() {
// The root page of your application
var pins = new List<UserTaskEntInfo>() { };
pins.Add(new UserTaskEntInfo() { Name = "上海市浦东新区陆家嘴街道乳山二村", Longitude = 31.2317331909, Latitude = 121.5170146362 });
pins.Add(new UserTaskEntInfo() { Name = "上海市浦东新区昌邑路555弄", Longitude = 31.2431982838, Latitude = 121.5215228609 });
pins.Add(new UserTaskEntInfo() { Name = "上海市浦东新区东昌路267号", Longitude = 31.2316324310, Latitude = 121.5063730654 });
pins.Add(new UserTaskEntInfo() { Name = "上海市浦东新区滨江大道", Longitude = 31.2379863826, Latitude = 121.4959153979 });
pins.Add(new UserTaskEntInfo() { Name = "上海市浦东新区即墨路", Longitude = 31.2435242682, Latitude = 121.5104350816 });
NavigationTestPage = new NavigationPage(new Page1() { Pins = pins });
MainPage = NavigationTestPage;
}
在MyTencentMap.Droid中将第一步binding生成的dll引入进来,
添加CustomTencentMapRenderer.cs
[assembly: ExportRenderer(typeof(TencentMapPage), typeof(CustomTencentMapRenderer))]
namespace MyTencentMap.Droid {
public class CustomTencentMapRenderer : PageRenderer { private TencentMapPage myAMapPage;
private LinearLayout layout1;
private MapView mapView;
private Bundle bundle; protected override void OnElementChanged(ElementChangedEventArgs<Page> e) { base.OnElementChanged(e);
myAMapPage = e.NewElement as TencentMapPage;
layout1 = new LinearLayout(this.Context);
this.AddView(layout1); mapView = new MapView(this.Context) {
LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent)
};
LatLng SHANGHAI = new LatLng( 31.238068, 121.501654);
mapView.Map.SetCenter(SHANGHAI); var pins = myAMapPage.Pins; Drawable d = Resources.GetDrawable(Resource.Drawable.red_location);
Bitmap bitmap = ((BitmapDrawable)d).Bitmap;
LatLng latLng1;
foreach (UserTaskEntInfo pin in pins) {
latLng1 = new LatLng(pin.Longitude ?? 31.238068, pin.Latitude ?? 121.501654);
var markOption = new MarkerOptions();
markOption.InvokeIcon(new BitmapDescriptor(bitmap));
markOption.InvokeTitle(pin.Name);
markOption.InvokePosition(latLng1);
var fix = mapView.Map.AddMarker(markOption);
fix.ShowInfoWindow();
}
mapView.Map.SetZoom();
mapView.OnCreate(bundle);
layout1.AddView(mapView); } protected override void OnLayout(bool changed, int l, int t, int r, int b) {
base.OnLayout(changed, l, t, r, b);
var msw = View.MeasureSpec.MakeMeasureSpec(r - l, MeasureSpecMode.Exactly);
var msh = View.MeasureSpec.MakeMeasureSpec(b - t, MeasureSpecMode.Exactly);
layout1.Measure(msw, msh);
layout1.Layout(, , r - l, b - t);
}
}
}
编译即可。
最后附上截图:
本文的代码可以从https://github.com/Joetangfb/Sharper中获取。
Xamarin.Forms 调用腾讯地图的更多相关文章
- Xamarin.Forms 调用 腾讯地图SDK
Xamarin.Forms研究了好一段时间了,最近一直在学习中,想尝试一下调用其他的SDK,就如腾讯地图SDK(申请容易). 完成此次项目得感谢以下链接: http://www.cnblogs.com ...
- 微信小程序wx.getLocation()获取经纬度及JavaScript SDK调用腾讯地图API获取某一类地址
简介 腾讯位置服务为微信小程序提供了基础的标点能力.线和圆的绘制接口等地图组件和位置展示.地图选点等地图API位置服务能力支持,使得开发者可以自由地实现自己的微信小程序产品. 在此基础上,腾讯位置服务 ...
- H5调用腾讯地图
获取当前定位的经纬度并在容器内显示当前位置 (安卓上的位置有点偏差) 在vue的index.html中需要引用 template <div id="container" st ...
- C# 调用腾讯地图WebService API获取距离(一对多)
官方文档地址:https://lbs.qq.com/webservice_v1/guide-distance.html 代码: /// <summary> /// 获取距离最近的点的经纬度 ...
- 微信小程序 - 调用腾讯地图插件
1. 登录公众号平台 https://mp.weixin.qq.com/ 2. 设置->第三方服务->添加插件->输入插件名称->申请 3. 项目中使用 3.1 app.jso ...
- Xamarin.Forms介绍
On May 28, 2014, Xamarin introduced Xamarin.Forms, which allows you to write user-interface code tha ...
- [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息
因为需要在小程序加个定位并加载对应城市信息 然而小程序自带api目前只能获取经纬度不能逆解析,虽然自己解析方式,但是同时也要调用地图,难道用户每次进小程序还要强行打开地图选择地址才定位吗?多麻烦也不利 ...
- 百度地图转腾讯地图腾讯地图转百度地图(还有方法二就是使用百度地图api 转火星坐标)
public static double pi = 3.141592653589793 * 3000.0 / 180.0; /** * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转 ...
- 腾讯地图 API 调用入门
本文仅为腾讯地图 API 调用入门,如需进阶学习,请在腾讯位置服务网站上进行学习. 登陆网址 https://lbs.qq.com/ 点击右上角的登陆按钮,需要进行注册按照流程进行就好. 完成之后,选 ...
随机推荐
- cfq调度器
cfq调度是block层最复杂的一个调度器,主要思想是是说每个进程平均享用IO带宽,实现方法是在时间上对进程进行划分,以此达到平均占用IO的目的.带着几个问题去看cfq 1)现在进程来了之后,是插入到 ...
- 基于linux操作系统安装、使用memcached详解
1.memcached的应用背景及作用 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态. ...
- ES6 Destructuring Assignment All In One
ES6 Destructuring Assignment All In One ES6 & Destructuring Assignment Axios, vue https://develo ...
- regex & tab spaces
regex & tab spaces txt file format let x = `2018-10-20a2018-10-20a2018-10-20a`; x.replace(/a/ig, ...
- 【Luogu】P2498拯救小云公主(spfa)
题目链接 我水爆了- - 容易发现可以把两个圆之间连边,左上为起点右下为终点,最小生成树直到起点跟终点连起来,输出边权/2就行. 然后80. 并不理解为什么这可以转化成spfa求最短路,邻接矩阵暴力跑 ...
- 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式
如何正确使用NIO来构架网络服务器一直是最近思考的一个问题,于是乎分析了一下Jetty.Tomcat和Mina有关NIO的源码,发现大伙都基于类似的方式,我感觉这应该算是NIO构架网络服务器的经典模式 ...
- [LeetCode] Restore IP Addresses 回溯
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- YYH的球盒游戏(NOIP模拟赛Round 6)
题目描述 YYH有一些总共有种颜色的球,他有颜色的球个.他同样有个盒子,第个盒子能放个球. 他的目标是把这个球按规则放进个盒子里: 对于一个盒子,对于每种颜色的球至多只能放个. 把颜色为的球放进盒子, ...
- Linux下使用system()函数一定要谨慎
转载自:http://my.oschina.net/renhc/blog/53580 linux尽量避免使用system. 曾经的曾经,被system()函数折磨过,之所以这样,是因为对syste ...
- Ubuntu配置网络遇到的一些问题
Ubuntu配置网络遇到的一些问题 在配置Ubuntu网络时,曾遇到了一些问题.查找了一些博客,所幸都解决了.记录一下,以便日后查阅. 设置DNS sudo vim /etc/resolv.conf ...