做一个高德地图的 iOS / Android .NET MAUI 控件系列 - 创建控件

我们知道 MAUI 是开发跨平台应用的解决方案 ,用 C# 可以直接把 iOS , Android , Windows , macOS , Linux ,Tizen 等应用开发出来。那我们在这个框架除了用底层自定义的 UI 控件外,如果我们要用如高德地图这样的第三方控件,要如何做呢?接下来我就和大家介绍一下。

如果你还没有学习原生库绑定的知识,可以到以下链接学习相关内容:

CA周记 - 跟我做⼀个⾼德地图的 iOS / Android MAUI控件(iOS 原生库绑定)

CA周记 - 跟我做⼀个⾼德地图的 iOS / Android MAUI控件(Android 原⽣库绑定)

在上面两个例子中我们学习到把原生高德的 iOS / Android SDK 绑定,也用 .NET for iOS 和 .NET for Android 进行了调用。但要用 MAUI 就意味着调用方式改变, 一次性编写多平台使用。要实现这个效果,先看看 MAUI 的基础架构。

289c1ba81abb5831d6dc04bb0fc0f052.png

我们可以清楚看到, MAUI 除了公用的 xmal 文件外, 实际上也把特定平台的一些设定放置到 Platforms 的文件夹内, Platforms 的自文件夹就是对应的平台。我们知道可以根据不同平台去渲染平台界面。这就是我们常说的自定义平台控件了。

在前言部分我们也提到了 MAUI 采用 Handler 模式去设定平台界面。如果我们要实现一个高德地图的 MAUI 控件,具体的架构是这样的:

f5805980b7f5f39387bf67a2edd543ad.png

我们需要去创建如上图的一个结构,我们需要为 AMap 添加一个共享文件 AMap.shared.cs ,这个文件 AMapHandler 继自 ViewHandler。

public interface IAMap : IView{}public class AMap : View, IAMap{}partial class AMapHandler{public static IPropertyMapper<AMap, AMapHandler> MapMapper = new PropertyMapper<AMap, AMapHandler>(ViewHandler.ViewMapper){ };public AMapHandler() : base(MapMapper){ }}

然后在 Platforms 下的 Android 和 iOS 文件夹添加各自的平台 AMap 调用方法。

b3bbb433e890a8cc730487e69eeef180.png

为 AMap.Android.cs 添加 Android 环境下高德地图的渲染方式

namespace AMap.UI.Apps
{public partial class AMapHandler : ViewHandler<IAMap, MapView>{private AMapHelper _mapHelper;private MapView mapView;internal static Bundle Bundle { get; set; }public AMapHandler(IPropertyMapper mapper, CommandMapper commandMapper = null) : base(mapper, commandMapper){}protected override MapView CreatePlatformView(){mapView = new Com.Amap.Api.Maps.MapView(Context);return mapView;}protected override void ConnectHandler(MapView platformView){base.ConnectHandler(platformView);AMapLocationClient.UpdatePrivacyAgree(Context, true);AMapLocationClient.UpdatePrivacyShow(Context, true, true);_mapHelper = new AMapHelper(Bundle, platformView);mapView = _mapHelper.CallCreateMap();}}class AMapHelper : Java.Lang.Object{private Bundle _bundle;private MapView _mapView;public event EventHandler MapIsReady;public MapView Map { get; set; }public AMapHelper(Bundle bundle, MapView mapView){_bundle = bundle;_mapView = mapView;}public MapView CallCreateMap(){_mapView.OnCreate(_bundle);return _mapView;}}}

为 AMap.iOS.cs 添加 iOS 环境下高德地图的渲染方式

amespace AMap.UI.Apps
{public partial class AMapHandler : ViewHandler<IAMap, MAMapView>
{public AMapHandler(IPropertyMapper mapper, CommandMapper commandMapper = null) : base(mapper, commandMapper){}protected override MAMapView CreatePlatformView(){MAMapView.UpdatePrivacyShow(AMapPrivacyShowStatus.DidShow, AMapPrivacyInfoStatus.DidContain);MAMapView.UpdatePrivacyAgree(AMapPrivacyAgreeStatus.DidAgree);AMapServices.SharedServices.ApiKey = "";AMapServices.SharedServices.EnableHTTPS = true;//try//{MAMapView map = new MAMapView();map.SetShowsUserLocation(true);map.SetUserTrackingMode(MAUserTrackingMode.Follow);return map;}protected override void ConnectHandler(MAMapView PlatformView){ }protected override void DisconnectHandler(MAMapView PlatformView){if (PlatformView.Delegate != null){PlatformView.Delegate.Dispose();PlatformView.Delegate = null;}PlatformView.RemoveFromSuperview();}}}

项⽬⾥⾯有 Transforms ⽂件夹有对应的三个 xml ⽂件,分别是 EnumFields.xml ,EnumMethods.xml , Metadata.xml , 各⾃作⽤如下 :

1.因为这个控件只是针对 iOS / Android 两个平台,所以我们只保留 net6.0-android 和 net6.0-ios

2.高德 SDK 运行建议在真机下使用,特别是 iOS ,需要制定版本号,还有编译环境,我的环境是在 Apple silicon 下所以也要设定好 RuntimeIdentifier,还有就是编译的时候,我花了特别多时间在这里,大家可以参考我这个在 GitHub 上自问自答的Issue https://github.com/xamarin/xamarin-macios/issues/15372

<PropertyGroup Condition="$(TargetFramework.Contains('-ios'))"><RuntimeIdentifier>ios-arm64</RuntimeIdentifier><UseMSBuildEngine>true</UseMSBuildEngine><WarningLevel>4</WarningLevel><MtouchLink>SdkOnly</MtouchLink><SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion><DeviceSpecificBuild>true</DeviceSpecificBuild><MtouchDebug>true</MtouchDebug><MtouchFastDev>true</MtouchFastDev><MtouchProfiling>true</MtouchProfiling><MtouchUseSGen>true</MtouchUseSGen><MtouchUseRefCounting>true</MtouchUseRefCounting><MtouchFloat32>true</MtouchFloat32></PropertyGroup>

3.记得按照平台引入原生库的绑定

<ItemGroup Condition=" '$(TargetPlatformIdentifier)' == 'ios' "><ProjectReference Include="..\iOS.AmapSDK.Foundation\iOS.AmapSDK.Foundation.csproj" /> <ProjectReference Include="..\iOS.AmapSDK.3D\iOS.AmapSDK.3D.csproj" /> </ItemGroup><ItemGroup Condition=" '$(TargetPlatformIdentifier)' == 'android' "><ProjectReference Include="..\Droid.AmapSDK\Droid.AmapSDK.csproj" /> </ItemGroup>

查看完整项目文件,请点击该链接:

https://github.com/kinfey/AMapMAUIControls/blob/main/src/AMap.UI.Demo/AMap.UI.Apps/AMap.UI.Apps.csproj

也别忘记去把一些平台特有的设定设置好,具体可以

(1)iOS 设定请点击该链接:

https://github.com/kinfey/AMapMAUIControls/blob/main/src/AMap.UI.Demo/AMap.UI.Apps/Platforms/iOS/Info.plist

(2)Android 设定请点击该链接:

https://github.com/kinfey/AMapMAUIControls/blob/main/src/AMap.UI.Demo/AMap.UI.Apps/Platforms/Android/AndroidManifest.xml

4.在 MauiProgram.cs 上注册

builder.UseMauiApp<App>().ConfigureFonts(fonts =>{fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");}).ConfigureMauiHandlers(handlers =>{handlers.AddHandler(typeof(AMap), typeof(AMapHandler));});

选择编译运行就可以看到高德地图终于可以在 MAUI 环境下跑起来了。

57b93a6e4f833c28cc769c5d7abf5384.png

a6134b072333a177ccf3aec1f8678c6e.jpeg

小结

对于很多人来说或者都是初步接触了 MAUI ,实际上要做好多平台的兼容还要有非常长的路要走。希望通过这个系列的文章,能给一些第三方厂商和开发者一些帮助,能尽快提供 MAUI 的支持。这样才能为这个新的技术注入活力。

*相关资料

1. 通过 Microsoft Docs 了解 MAUI 

https://aka.ms/Docs.MAUI

2. 通过 Microsoft Learn 学习 MAUI 

https://aka.ms/Learn.MAUI

3. 学习 ViewHandler 自定义 MAUI组件 请点击访问该链接 

https://docs.microsoft.com/zh-cn/dotnet/maui/user-interface/handlers/customize

CA周记往期回顾:

045be3a2bb6b3936d2d1be09ef28aef5.jpeg

更多原创文章与资源共享

请关注Kinfey Techtalk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flask中的session,render_template()第二和参数是字典

1. 设置一个secret_key 2.验证登入后加上session,这是最简单,不保险 . 3.注意render_template传的参数是字典 转载于:https://www.cnblogs.com/cuzz/p/8087844.html

失败记录两则

一&#xff0c;未找出为什么有的CPU应用超高&#xff0c;而另一些CPU静静啥也不干。可能是将JOB的优先级设置低了&#xff1f; 二&#xff0c;给BOSS的三星I9300线刷港版ROM失败。可能文件坏&#xff0c;最可能数据线不是原装&#xff1f;

【QGIS入门实战精品教程】1.1:QGIS与GIS的区别和联系

「刘一哥GIS」系列专栏《QGIS入门实战精品教程(配套案例数据)》目录 1. QGIS概述 QGIS(在2.0版本之前称之为Quantum GIS)于2002年由Gary Sherman创立,在2007年由OSGeo接管,并于2009年发布了1.0版本,目前最高版本为3.22。QGIS采用开源证书GNU GPLv2 (GNU General Public…

简单的对拍

在算法竞赛中&#xff0c;我们常用对拍来初步检验程序。 网上也有其它的关于对拍的教程&#xff0c;但是任性的我还是要自己写一篇教程。  首先&#xff0c;我们要知道我们是用一个叫做” 批处理文件&#xff08;.bat&#xff09;“的东西来处理这个问题。点击初步了解bat 不过…

AI 之 OpenCvSharp 大图找小图(案例版)

要说跟AI扯上啥关系&#xff0c;估计只有库本身了&#xff0c;但是&#xff0c;这个大图搜小图功能还是不错的&#xff0c;有喜欢的可以试试。我主要用的场景是&#xff0c;具体的某个界面为大图&#xff0c;界面的某个图标为小图&#xff0c;或者&#xff0c;整个桌面为大图&a…

SaaS应用的十二要素

简介 如今&#xff0c;软件通常会作为一种服务来交付&#xff0c;它们被称为网络应用程序&#xff0c;或软件即服务&#xff08;SaaS&#xff09;。12-Factor 为构建如下的 SaaS 应用提供了方法论&#xff1a; 使用标准化流程自动配置&#xff0c;从而使新的开发者花费最少的…

路由器与交换机区别

路由器与交换机区别 近日&#xff0c;在回答知道网友提问的时候&#xff0c;发现很多朋友不知道路由器与交换机的不同&#xff0c;常常问一些看起来有点可笑的问题。比如路由器同时登陆两个账号&#xff0c;所以今天写下这篇经验&#xff0c;科普一下路由器的功能和交换机的功能…

【QGIS入门实战精品教程】1.2:QGIS与ArcGIS的区别和联系

「刘一哥GIS」系列专栏《QGIS入门实战精品教程(配套案例数据)》目录 以下是GISGeography官方给出的两者之间的27点比较(译): 官方网址:https://gisgeography.com/qgis-arcgis-differences/ 1.QGIS容纳更多的数据格式 ArcGIS没有支持所有的数据格式,毫无疑问,QGIS在处…

押注.NET 是件好事

作者 | Bryan Costanich译者 | 明知山策划 | 褚杏娟作为一个在.NET 上构建了不止一个流行平台的人&#xff0c;我经常被问到它的相关性&#xff0c;以及它是不是一个值得投入的生态系统。这个问题在旧金山湾区的技术世界里尤为流行&#xff0c;这里的技术潮流就像四季一样变更交…

8-12 canvas专题-阶段练习一(上)

8-12 canvas专题-阶段练习一&#xff08;上&#xff09; 1 <!DOCTYPE html>2 <html lang"zh-cn">3 <head>4 <meta charset"UTF-8">5 <title>8-12 课堂演示</title>6 </head>7 <style type"text…

【QGIS入门实战精品教程】2.2:QGIS软件的下载与安装(Windows)

文章目录 一、QGIS下载二、QGIS安装​一、QGIS下载 QGIS软件官网下载地址:https://www.qgis.org/en/site/ 进入官网之后,点击【Download Now】进入下载页面: 选择对应的版本进行下载: 开始下载:

Linux sudo找不到命令:修改sudo的PATH路径

为什么80%的码农都做不了架构师&#xff1f;>>> sudo有时候会出现找不到命令&#xff0c;而明明PATH路径下包含该命令&#xff0c;让人疑惑。其实出现这种情况的原因&#xff0c;主要是因为当 sudo以管理权限执行命令的时候&#xff0c;linux将PATH环境变量进行了重…

快速判断站点是否存活的 3 种编程实现

前言如何知道外部站点是否正在运行&#xff1f;如果使用浏览器&#xff0c;直接访问对应站点即可。那么&#xff0c;使用 C# 以编程方式&#xff0c;如何实现呢&#xff1f;GET 请求首先想到的&#xff0c;就是使用 HttpClient 向该站点发送 HTTP 请求&#xff0c;并检查返回状…

【数据结构与算法】拓扑排序问题C语言实现

拓扑排序是有向无环图的一种应用,在实际生活中用的很多。 比如GIS专业的课程设计,许多课程需要前置课程要求,也就是说没上过A课程、则不可能直接去学B课程,画个图表就是: 同理,我们教材中的范例:穿衣服的过程也是一个拓扑排序问题,如下表: 有关这个拓扑排序的模型构造…

[转]2020年排名前20的基于SpringBoot搭建的开源项目,帮你快速进行项目搭建!

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 287 篇原创分享 作者 l Hollis 来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09; SpringBoot一直是开发者比较青睐的一款轻量级框架&#xff0c;他不仅继承了Spring框架原有的优秀特性&#xff0c;而…

C# 搭建一个基于.NET5的WPF入门项目

概述.NET5 发布已经有一阵子了&#xff0c;今天抽空体验一哈&#xff0c;搭建一个WPF项目实例&#xff0c;看看和传统的.NET Framework有什么区别&#xff01;开发环境&#xff1a;VS2019 WPF框架&#xff1a;Caliburn.Micro 版本4.0.173.NET版本&#xff1a;.NET5.0项目创建步…

五个最佳案例带你解读 Node.js 的前后之道

Node.js 是什么&#xff1f; Node.js 采用 C语言编写而成&#xff0c;浏览器内核 V8 做为执行引擎&#xff1b; Node 不是 JS 应用、而是一个 Javascript 的运行环境。 Node 保留了前端浏览器 js 的接口&#xff0c;没有改写语言本身的任何特性&#xff0c;依旧基于作用域和原型…

【ArcGIS风暴】根据海拔范围分级统计GIMMS 3g NDVI平均值案例教程——以甘肃省为例

在论文写作时,通常要根据区域进行统计栅格数据。本文以甘肃省dem、NDVI数据为例,讲解根据海拔范围分级统计NDVI平均值、最大值、最小值和面积等。 1. 海拔分类 dem是本案例的最基本数据,打开ArcMap,加载dem数据,如下图所示: 首先要对dem进行分级,所使用的到的工具是重分…

【转】知道这20个正则表达式,能让你少写1,000行代码

正则表达式&#xff0c;一个十分古老而又强大的文本处理工具&#xff0c;仅仅用一段非常简短的表达式语句&#xff0c;便能够快速实现一个非常复杂的业务逻辑。熟练地掌握正则表达式的话&#xff0c;能够使你的开发效率得到极大的提升。下面是技匠整理的&#xff0c;在前端开发…

Dapr中国社区网站(预览版)发布!

点击蓝字关注我们社区介绍Dapr 是一个可移植的、事件驱动的运行时&#xff0c;它使任何开发人员能够轻松构建出弹性的、无状态和有状态的应用程序&#xff0c;并可运行在云平台或边缘计算中。Dapr 中国社区是一个以 Dapr 为中心的中立而开放的技术社区&#xff0c;为 Dapr 用户…