第九章 特定於平台的API呼叫(一)

2021-09-20 08:49:09 字數 2224 閱讀 9758

緊急情況已經出現。任何玩過上一章的monkeytap遊戲的人都會很快得出結論,它迫切需要乙個非常基本的增強功能,而且它根本不可能在沒有它的情況下存在。

monkeytap需要聲音。

它不需要非常複雜的聲音 - 伴隨著四個boxview元素的閃光,只需要幾聲嘟嘟聲。但是xamarin.forms api不支援聲音,所以聲音不是我們可以通過幾個api呼叫新增到monkeytap的東西。支援聲音需要有點像xamarin.forms來利用平台特定的聲音生成設施。弄清楚如何在ios,android和windows phone中發出聲音是很難的。但是,xamarin.forms程式如何呼叫各個平台呢?

在解決聲音的複雜性之前,讓我們通過乙個更簡單的例子來研究製作平台特定api呼叫的不同方法。本章中顯示的前三個短程式在功能上完全相同:它們都顯示由底層平台作業系統提供的兩個微小資訊項,顯示執行程式的裝置模型和作業系統版本。

正如您在第2章「應用程式剖析」中所了解到的,您可以使用共享資產專案(sap)或可移植類庫(pcl)來獲取所有三個平台通用的**。 sap包含在平台專案之間共享的**檔案,而pcl將公共**包含在只能通過公共型別訪問的庫中。

從共享資產專案訪問平台api比從可移植類庫更簡單,因為它涉及更傳統的程式設計工具,所以讓我們首先嘗試這種方法。 您可以使用第2章中描述的過程使用sap建立xamarin.forms解決方案。然後,您可以將基於xaml的contentpage類新增到sap,就像將其新增到pcl一樣。

這是顯示平台資訊的專案的xaml檔案,名為platinfosap1:

**隱藏檔案必須為modellabel和versionlabel設定text屬性。

共享資產專案中的**檔案是各個平台中**的擴充套件。 這意味著sap中的**可以使用c#預處理程式指令#if,#elif,#else和#endif以及為這三個平台定義的條件編譯符號,如第2章和第4章所示。這些符號是:

當然,獲取模型和版本資訊所涉及的api對於三個平台是不同的:

這是platinfosap1.xaml.cs**隱藏檔案,顯示了如何根據條件編譯符號設定modellabel和versionlabel:

using system;

using xamarin.forms;

#if __ios__

using uikit;

#elif __android__

using android.os;

using windows.security.exchangeactivesyncprovisioning;

#endif

namespace platinfosap1

", device.systemname,

device.systemversion);

#elif __android__

modellabel.text = string.format(" ", build.manufacturer,

build.model);

versionlabel.text = build.version.release.tostring();

easclientdeviceinformation devinfo = new easclientdeviceinformation();

modellabel.text = string.format(" ", devinfo.systemmanufacturer,

devinfo.systemproductname);

versionlabel.text = devinfo.operatingsystem;

#endif}}

}

請注意,這些預處理程式指令用於選擇不同的using指令以及呼叫特定於平台的api。 在像這樣簡單的程式中,您可以簡單地將命名空間包含在類名中,但是對於更長的**塊,您可能希望使用指令。

當然它有效:

這種方法的優點是您可以在乙個位置擁有三個平台的所有**。 但**清單中的預處理程式指令 - 讓我們面對它 - 相當醜陋,它們又回到了程式設計的早期時代。 使用預處理程式指令對於簡短且不太頻繁的呼叫(例如此示例)可能看起來不那麼糟糕,但是在較大的程式中,您需要處理特定於平台的**塊和共享**,並且可以輕鬆地執行大量預處理程式指令? 變得混亂。 預處理程式指令應該用於少量修復,通常不作為應用程式中的結構元素。

讓我們嘗試另一種方法。

第九章 關公的臉譜

1.紅臉關公的由來 關公的臉譜 石可破也,而不可奪堅 丹可磨也,而不可奪赤。堅與赤,性之有也。性也者,所受於天也,非擇取而為之也。豪士之自好者,其不可漫以汙也,亦猶此也。呂氏春秋 話說曹操煮酒論英雄之時,忽然驚雷暴雨,關羽 張飛惦記著劉備,急忙送傘過來。曹操看到關羽,眼前頓時一亮,笑著對劉備說 我剛...

第九章 類的重用

一 什麼是繼承?1 繼承是類與類間的關係。2 是一種什麼 是 什麼的關係。3 繼承功能就是用來解決 重用的問題。1 繼承 是一種建立新類的方式,python中,1 新建的類可以繼承乙個或多個父類。2 父類可以成為基類或超類。3 所新建的類稱為子類或派生類。2 類繼承的數量 python中類的繼承分為...

第九章 做決定的時刻

2.影響自我完整性的決定 3.重大決定 三種型別的要求 1 無關緊要的要求 2 牽扯到重要的問題,中度 3 重要的決定,一旦讓步,就是傷害。請注意 雖然是無關緊要的決定,但是不要有自動的行為模式。而是應該審視對方的要求,尤其是呈現方式,放在大環境下進行分析。批判性地思考問題所在 1 我們之間固定的相...