在以前的 《Flutter 上默認的文本和字體知識點》 和 《帶你深入理解 Flutter 中的字體“冷”知識》 中,已經介紹了很多 Flutter 上關于字體有趣的知識點,而本篇講繼續介紹 Flutter 上關于 Text 的一個屬性: FontFeature , 事實上相較于 Flutter ,本篇內容可能和前端或者設計關系更密切 。
創新互聯建站主要從事成都做網站、成都網站設計、網頁設計、企業做網站、公司建網站等業務。立足成都服務依蘭,十余年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:18982081108
什么是 FontFeature ? 簡單來說就是影響字體形狀的一個屬性 ,在前端的對應領域里應該是 font-feature-settings ,它有別于 FontFamily ,是用于指定字體內字的形狀的一個參數。
我們知道 Flutter 默認在 Android 上使用的是 Roboto 字體,而在 iOS 上使用的是 SF 字體,但是其實 Roboto 字體也是分很多類型的,比如你去查閱手機的 system/fonts 目錄,就會發現很多帶有 Roboto 字樣的字體庫存在。
所以 Roboto 之類的字體庫是一個很大的字體集,不同的 font-weight 其實對應著不同的 ttf ,例如默認情況下的 Roboto 是不支持 font-weight 為 600 的配置 :
所以如下圖所示,如果我們設置了 w400 - w700 的 weight ,可以很明顯看到中間的 500 和 600 其實是一樣的粗細,所以在 設置 weight 或者設計 UI 時,就需要考慮不同平臺上的 weight 是否支持想要的效果 。
回歸到 FontFeature 上,那 Roboto 自己默認支持多少種 features 呢? 答案是 26 種,它們的編碼如下所示,運行后效果也如下圖所示,從日常使用上看,這 26 種 Feature 基本滿足開發的大部分需求。
而 iOS 上的 SF pro 默認支持 39 種 Features , 它們的編碼如下所示,運行后效果也如下圖所示,可以看到 SF pro 支持的 Features 更多。
所以可以看到,并不是所有字體支持的 Features 都是一樣的,比如 iOS 上支持 sups 上標顯示和 subs 下標顯示,但是 Android 上的 Roboto 并不支持,甚至很多第三方字體其實并不支持 Features 。
有趣的是,在 Flutter Web 有一個渲染文本時會變模糊的問題 #58159 ,這個問題目前官方還沒有修復,但是你可以通過給 Text 設置任意 FontFeatures 來解決這個問題。
最后,如果對 FontFeature 還感興趣的朋友,可以通過一下資料深入了解,如果你還有什么關于字體上的問題,歡迎留言討論。
基于網友的問題再補充一下拓展知識,畢竟這方面內容也不多 。
事實上在 dart 里就可以看到對應 FontWeight 約定俗稱用的是字體集里的什么字體:
所以如果對于默認字體有疑問,可以在你的手機字體找找是否有對應的字體, 比如雖然我們說 roboto 沒有 600 ,但是如果是 roboto mono 字體集是有 600 的 fontweight ,甚至還有 600 斜體: 。
另外注意這是 Flutter 而不是原生,具體實現調用是在 Engine 的 paragraph_skia.cc 和 paragraph_builder_skia.cc 下對應的 setFontFamilies 相關邏輯,當然默認字體庫指定在 typography.dart 下就看到,例如 'Roboto' 、 '.SF UI Display' 、 '.SF UI Text' 、 '.AppleSystemUIFont' 、 'Segoe UI' :
另外如果你在 Mac 的 Web 上使用 Flutter Web,可以看到指定的是 .AppleSystemUIFont ,而對于 .AppleSystemUIFont 它其實不算是一種字體,而是蘋果上字體的一種集合別稱:
[圖片上傳失敗...(image-40f5ce-1648368234737)]
還有,如果你去看 Flutter 默認自帶的 cupertino/context_menu_action.dart ,就可以看到一個有趣的情況:
當然,前面我們說了那么多,主要是針對英文的情況下,而在中文下還是有差異的 ,之前的文章也介紹過:
例如,在蘋果上的簡體中文其實會是 PingFang SC 字體,對應還有 PingFang TC 和 PingFang HK 的繁體集,而關于這個問題在 Flutter 上之前還出現過比較有意思的 bug :
當然后續的 #16709 修復了這個問題 ,而在以前的文章我也講過,當時我遇到了 “Flutter 在 iOS 系統上,系統語言是韓文時,在和中文一起出現會導致字體顯示異常" 的問題 :
解決方法也很簡單,就是給 fontFamilyFallback 配置上 ["PingFang SC" , "Heiti SC"] 就可以了,這是因為韓文在蘋果手機上使用的應該是 Apple SD Gothic Neo 這樣的超集字體庫,【廣】這個字符在這個字體集上是不存在的,所以就變成了中文的【廣】;
所以可以看到,字體相關是一個平時很少會深入接觸的東西,但是一旦涉及多語言和繪制,就很容易碰到問題的領域 。
flutter作為一個相對來說比較新興的框架,相比于其他框架來說避免不了存在生態不完善的問題。要想實現flutter直播,可以接入即構科技的Express Flutter SDK,然后通過集成、初始化SDK、登錄房間服務器、用戶推送自己的本地音視頻、拉取遠端的音視頻流等簡單五個步驟實現簡單的實時音視頻場景進行直播。
在玩安卓上有款組件化開源app的項目,一款模仿 Eyepetizer | 開眼視頻的 開源app,這款app設計風格特別喜歡的,比較簡潔,美觀,然后最近又在學flutter的知識,于是就寫了一款flutter版本的開源短視頻,效果也是聽不錯的,廢話不多說,先上效果圖。
先附上項目地址:
項目api會在后面的參考鏈接里,或者直接項目內查看。
項目地址:
更新:6/30 項目新增下拉刷新,上拉加載功能
kotlin版本開眼短視頻開發中,敬請期待...
總結:在此感謝參考的伙伴的文章,寫的也很好,然后我將這個項目改寫成了flutter,當中也學習到了很多flutter相關的知識,后續還有繼續鞏固,不斷學習。
參考鏈接(包含本項目的api)
點擊 “協議、稅務和銀行業務”
內購用的是付費應用程序,先簽署《付費應用程序協議》,同意后狀態變更為“用戶信息待處理”,等待審核。
狀態更改完畢后,點擊“開始設置稅務、銀行業務和聯系信息”。
(1)添加銀行賬戶,按照要求填寫相關內容即可。
(2)選擇報稅表,并填寫。所有與 Apple 有商業合作者必選都是美國,若有其他需求,可以多選。
繼續填寫,首先認證公司基本信息,選擇所有人類型,確認無誤后認證條款處打對勾
Part I 部分,繼續核對公司相關信息,選填內容可不填。
Part III 部分,簽署稅務條約,設置利益限制條款的種類,選填內容可不填。此部分如果需要可勾選上下圖勾選框,不需要可不勾選,我們這個項目沒有用到part III 部分,所以沒有勾選。
Part XXX 部分,確認之前填寫的信息,勾選完畢后,提交
(3)填寫聯系信息,共5個。高級管理、財務、技術、法務、營銷。只需要提供5個人的基本信息即可。
只可使用一次的產品,使用之后即失效,必須再次購買。
示例: 釣魚 App 中的魚食。
只需購買一次,不會過期或隨著使用而減少的產品。
示例: 游戲 App 的賽道。
允許用戶在固定時間段內購買動態內容的產品。除非用戶選擇取消,否則此類訂閱會自動續期。
示例: 每月訂閱提供流媒體服務的 App。
允許用戶購買有時限性服務的產品。此 App 內購買項目的內容可以是靜態的。此類訂閱不會自動續期。
示例: 為期一年的已歸檔文章目錄訂閱。
App 內購買項目的截屏,即所售項目的示意圖。例如,如果 App 內購買項目是一本圖書,您可以提交圖書的截屏。您也可以提交購買頁的截屏。該截屏僅用于 Apple 審核,不會在 App Store 中顯示。
截屏要求如下:
iOS 至少需要 640 x 920 像素
Apple tvOS 需要 1920 x 1080 像素
macOS 需要 1280 x 800 像素
App 審核圖像上傳后,可以替換,但無法移除。當您的 App 內購買項目處于審核中時,您無法更新截屏。
沙箱賬號是不能直接在App Store進行登錄的,只能在點擊了購買商品之后,在彈出的登錄框進行登錄 。
驗證是否已登錄沙箱測試賬號:
設置--iTunes Store與App Store,頁面拉到最底部,會看到沙箱賬戶項會列出你已登錄的沙箱測試賬號!
操作方法一:打開App Store應用首頁滑到最下方--選中AppleID--注銷
操作方法二:設置--iTunes Store與App Store--選中AppleID--注銷
checks if the client can make payments(檢測App是否能支付)
getAvailablePurchases
Get all non-consumed purchases 獲取未消費的商品
打印信息查詢;
原因:
沒有先執行getProducts,直接執行requestPurchase方法,要先拉取商品列表,再執行購買操作.
問題描述;
1.漏單必須要處理,玩家花RMB購買的東西卻丟失了,是絕對不能容忍的。所謂的漏單就是玩家已經正常付費,卻沒有拿到該拿的道具。
解決:只要購買成功,便將購買記錄(receipt等賬單信息)保存下來,然后將賬單信息傳送給我們游戲服務器,游戲服務器獲得賬單后,和蘋果服務器驗證,賬單有效的話,回饋給游戲服務器處理,游戲服務器處理后,返回給游戲客戶端處理,處理完畢,將本地保存的購買記錄刪除。
官方文檔:向蘋果校驗支付憑證
21000 App Store無法讀取你提供的JSON數據
21002 收據數據不符合格式
21003 收據無法被驗證
21004 你提供的共享密鑰和賬戶的共享密鑰不一致
21005 收據服務器當前不可用
21006 收據是有效的,但訂閱服務已經過期。當收到這個信息時,解碼后的收據信息也包含在返回內容中
21007 收據信息是測試用(sandbox),但卻被發送到產品環境中驗證 【請求sandbox校驗支付憑證】
21008 收據信息是產品環境中使用,但卻被發送到測試環境中驗證
消耗類型: 例如:金幣、道具等。
非續訂訂閱: non-renewable subscription 例如:VIP
您的首個 App 內購買項目必須以新的 App 版本提交。請創建您的 App 內購買項目,然后前往 App 的“App Store”頁,從“App 內購買項目”中進行選擇,點按“提交”。 了解更多
在上傳二進制文件并提交首個 App 內購買項目以供審核后,您可以使用下表提交其他 App 內購買項目。
唐巧-iOS應用內付費(IAP)開發步驟列表
未完~待續
當使用內購購買過商品之后沒有把這個交易關閉,所以再次去購買商品后就會調用以前已經購買成功的交易去購買因為已經購買過,才會有這個提示
原因:添加內購項目時,信息填寫不完整,app審核圖像未上傳
處理方法:上傳app審核圖片( 合適的尺寸 ),點擊提交,狀態改為正在準備審核中。
這個是內購選擇類型不匹配原因導致。
購買成功之后,Apple會返回以下四個數據給應用
Reference
Review the updated Paid Applications Schedule.
游客身份解決方案:即不登錄也要能購買
1)服務器端做一個蘋果審核機制,審核期間游客身份可以進行一切行為,一旦審核通過,修改服務端即可達到強制用戶登錄進行內購買的目的(這個有點。。。)
2)游客可以進行內購買,購買時以設備UUID為準,生成一個游客賬號,將購買信息保存在服務器和本地,當用戶登錄正式賬戶后判斷此設備是否進行過內購,有的話提示用戶將游客身份購買的權益與現有賬號綁定,如果綁定,游客權益則遷移到正式賬戶,如果不遷移,則游客身份和正是賬戶是兩個獨立賬戶,正式賬戶不享有游客身份的權益(我用的這個)
內購游客模式解決方案
iOS內購規則
flutter很強,目前一套代碼可以供Android,iOS, Web 使用,妥妥的一套代碼,多端使用,在跨平臺開發中,有著巨大的影響。
注:亮度調節和音量調節gif無法體現,功能是ok的,其次默認Icon鎖的close和open實在難以分辨。
環境:Flutter 2.8.1 channel stable ;Dart 2.15.1
需要音頻播放器的看這里: Flutter音樂播放器
重點說下這個工具類,因為視頻播放,涉及到狀態改變有很多,筆者剛開始選擇使用 InheritedWidget 來在眾多的widget之間共享數據。但是總感覺這樣有點繁瑣,且不很優雅!
這里非廣告,如果是使用 GetX 就很簡單了,筆者也使用了 GetX 進行封裝了,一瀉千里的趕腳!,但是筆者還是那句話:剛開始接觸Flutter的開發者不是很建議使用 GetX ,可以先熟悉下Flutter狀態管理的基礎原理再行使用。而且為了盡量簡潔,還是不引入其他的第三方了。
我們選擇對第三方插件進行封裝的目的不外乎這幾個:
于是筆者就寫了一個工具類 VideoPlayerUtils ,專門且只用來處理播放器的所有業務。包括暫停、播放、跳轉、調節音量、調節亮度、切換視頻等操作。在所有的widget中不會引用關于 video_player 或其他第三方插件的任何信息, VideoPlayerUtils 負責widget與播放器之間的所有操作交互。后續優化迭代或更換播放器插件時,只需針對這個工具類進行修改,對所有widget不會有任何的影響,大大的解耦合了。
其中 VideoPlayerState :
提供以上的公共屬性,可以通過 VideoPlayerUtils 來獲取對應的值,使用 get 只讀,使外界不會誤修改這些屬性,以保證數值的安全性。開發者可根據自身需要自行添加屬性。
提供以上方法來處理播放器的所有業務。同樣的開發者可根據自身需要自行添加或修改。
重點說下這個方法,是整個業務的核心方法,控制視頻的播放或暫停。開發者只要遇到播放或暫停是均可調用此方法,具體是播放或暫停,內部根據傳入的 url 自行判斷,開發者不需要關心。
切換新視頻也是使用此方法,傳入的 url 與上次不一致,自動切換新視頻。筆者可根據 statusListener 來監聽播放狀態的改變,以此處理自身邏輯。
這個也需要提下,視頻播放器在播放新視頻時會異步初始化,一般我們的操作是在 initState() 初始化,成功后再 setState() 。這里筆者遇到一個讓人蛋疼的問題:
我們看 video_player 的使用:
VideoPlayer(controller) :widget中已經持有了controller。本來筆者封裝的目的就是為了讓widget與controller的之間解耦合。但此時的筆者。。。。
放棄不是不可能放棄的,這輩子都不會放棄的!
于是筆者取了巧,寫了一個初始化監聽器 initializedListener ,包換2個參數: bool,Widget ,初始化是否成功;其中widget為初始化成功返回需要展示的播放器UI,失敗默認返回 const SizedBox() 。
到這里就可以簡單使用了:
沒看錯,視頻播放就是這么簡單。
如果有更多的業務功能,筆者也按照自己的需求寫了一套,同樣的開發者可根據自身需要自行添加或修改。
VideoPlayerGestures 主要是處理手勢的,比如快進、快退等跳轉播放;左側上下滑動調節亮度;右側上下滑動調節音量;單擊是否開啟沉浸式播放,所有widget的隱藏與顯示;雙擊播放、暫停等。
哦,還有 PercentageWidget 也放到這個文件下了,就是這玩意:
因為顯示的百分比與手勢相關,隨著手勢移動而更新。開發者可自行處理。
筆者處出于簡單考慮,就按照整個UI的位置命名了。瞅一眼就知道是啥玩意。
同樣的開發者可根據自身需要自行添加或修改。
就是這玩意:
同樣的開發者可根據自身需要自行添加或修改。話說這個鎖的 Icon 的open和close是真的難分辨!
就是這玩意:
同樣的開發者可根據自身需要自行添加或修改。
這玩意是自定義的,別問,問就是跟產品干一架落了下風
主要就是自定義這玩意:
同樣的開發者可根據自身需要自定義。
注:這里沒有添加緩沖的進度,開發可查看 video_player 中的源碼 VideoProgressIndicator ,按業務自行定義。
這玩意就是整合以上的widget,再考慮下全屏的安全區域,沒啥東西。開發者可自行處理!
具體的實現監聽器的思路, 看這里 。
自此一個漂亮的Flutter視頻播放器就已經結束了。如果您覺得對您有些許幫助的話,歡迎 Star !
當前題目:flutter怎么玩,flutter經驗
路徑分享:http://vcdvsql.cn/article46/dsdgphg.html
成都網站建設公司_創新互聯,為您提供商城網站、外貿網站建設、網站內鏈、網站設計公司、品牌網站建設、響應式網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯