做一個高德地圖的 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.pswp.cn/news/284766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284766.shtml
英文地址,請注明出處:http://en.pswp.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

統一設置網站html文件輸出編碼為utf-8,以解決亂碼問題

如果設置整站&#xff0c;就在根目錄web.config設置如下參數&#xff0c;如果是指定目錄&#xff0c;在該目錄下的web.config文件設置如下參數&#xff0c;如果沒有web.config文件&#xff0c;可以直接新建一個&#xff1a; <?xml version"1.0" encoding"…

失敗記錄兩則

一&#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;從而使新的開發者花費最少的…

對話Linus:Linux 25歲啦

作為芬蘭Helsinki大學計算機科學系的學生&#xff0c;Linus Torvalds在1991年編寫了Linux操作系統的原始內核。很快&#xff0c;Linux就發展成為了一個全特征的操作系統&#xff0c;并開始運行在智能手機、服務器和各種設備中。在本次通過e-mail進行的訪談中&#xff0c;Torval…

路由器與交換機區別

路由器與交換機區別 近日&#xff0c;在回答知道網友提問的時候&#xff0c;發現很多朋友不知道路由器與交換機的不同&#xff0c;常常問一些看起來有點可笑的問題。比如路由器同時登陸兩個賬號&#xff0c;所以今天寫下這篇經驗&#xff0c;科普一下路由器的功能和交換機的功能…

【QGIS入門實戰精品教程】1.2:QGIS與ArcGIS的區別和聯系

「劉一哥GIS」系列專欄《QGIS入門實戰精品教程(配套案例數據)》目錄 以下是GISGeography官方給出的兩者之間的27點比較(譯): 官方網址:https://gisgeography.com/qgis-arcgis-differences/ 1.QGIS容納更多的數據格式 ArcGIS沒有支持所有的數據格式,毫無疑問,QGIS在處…

mysql中的增刪改查

顯示數據庫中有的表格 SHOW TABLES增 新建表格 CREATE TABLE urls( id int, url varchar(100), description varchar(100) ) 插入值 INSERT INTO chflvghu_test.user (user, password) VALUES (小紅, qwerty); 插入多條數據 INSERT INTO chflvghu_test.user (user, password) V…

押注.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】進入下載頁面: 選擇對應的版本進行下載: 開始下載:

UVa 10061 How many zero's and how many digits?

方法&#xff1a; factorial mod&#xff0c; logarithm 求trailing zeros&#xff0c;其實就是factorial mod 的應用&#xff0c; 求長度&#xff0c;利用log 函數。需要注意的是&#xff0c;答案為int(log(n!)/log(b)) 1, 比如 a 2, b 2, 長度為2. code: #include <cst…

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

為什么80%的碼農都做不了架構師&#xff1f;>>> sudo有時候會出現找不到命令&#xff0c;而明明PATH路徑下包含該命令&#xff0c;讓人疑惑。其實出現這種情況的原因&#xff0c;主要是因為當 sudo以管理權限執行命令的時候&#xff0c;linux將PATH環境變量進行了重…

Javscript 實現字符數串比對排序(包含數字及中文數字)

主要代碼&#xff1a; /** *description: 比較兩個字符串大小 *author: JackieZheng *date: 2020-12-03 19:59:39 */ function compare(a, b) {if (a b) {return 0;} else {let lsta a.toString().replace(/[一二三四五六七八九十百千萬億]/g, ChineseToNumber).split(/(\d…

【QGIS入門實戰精品教程】4.2:QGIS矢量數據采集(地圖數字化)案例教程

本文基于上一個實驗柵格數據地理配準,講述在QGIS中創建shp格式矢量數據(點、線、面)并進行矢量數據的采集與編輯。 文章目錄 一、實驗數據及任務二、創建Shapefile圖層三、數字化超詳細步驟一、實驗數據及任務 1. 實驗數據:為了保證實驗的連貫性,本次實驗采用的數據為上一…

快速判斷站點是否存活的 3 種編程實現

前言如何知道外部站點是否正在運行&#xff1f;如果使用瀏覽器&#xff0c;直接訪問對應站點即可。那么&#xff0c;使用 C# 以編程方式&#xff0c;如何實現呢&#xff1f;GET 請求首先想到的&#xff0c;就是使用 HttpClient 向該站點發送 HTTP 請求&#xff0c;并檢查返回狀…

jQuery.ajax實現根據不同的Content-Type做出不同的響應

使用H5ASP.NET General Handler開發項目&#xff0c;使用ajax進行前后端的通訊。有一個場景需求是根據服務器返回的不同數據類型&#xff0c;前端進行不同的響應&#xff0c;這里記錄下如何使用$.ajax實現該需求。 $.ajax({‘url‘: ‘GetWatermarkInfo.ashx‘,‘type‘:‘post…