本次主要是記錄Fultter Theme主題的設(shè)備與AppBar中的一些屬性的使用及說明。目前項(xiàng)目開發(fā)有了四個(gè)界面。前期主題沒太注意,今天看來要好好總結(jié)一下近期所學(xué)。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比大城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式大城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋大城地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
首先,Android主題沉浸式設(shè)置,F(xiàn)lutter篇:
根據(jù)字面意思就能看出來是對(duì)狀態(tài)懶得設(shè)置,其中用到了 dart:io 與 flutter/services.dart 這兩個(gè)重點(diǎn)Mark一下,有時(shí)間深入探究一下用法跟能力。回歸正題。
主題數(shù)據(jù),其中最常用的是 primarySwatch 、 primaryColor 、 accentColor 。
primarySwatch:UI右下角的FloatingActionButton的顏色就是默認(rèn)取值MaterialColor,
默認(rèn)是藍(lán)色的,如果修改成primarySwatch,就會(huì)變成這個(gè)顏色值。只支持MaterialColor。
primaryColor:頂部導(dǎo)航欄和狀態(tài)欄的顏色修改,需要用到這個(gè)屬性,類型 Color。
accentColor:前景色(文本、按鈕、覆蓋邊緣效果等)。
看一下項(xiàng)目中的使用
其中 brightness 主題設(shè)置較為關(guān)鍵,它是設(shè)置狀態(tài)欄圖標(biāo)與字體顏色的。
brightness: Brightness.dark 狀態(tài)欄圖標(biāo)與字體顏色為白色。
brightness: Brightness.light 狀態(tài)欄圖標(biāo)與字體顏色為黑色。
iconTheme :設(shè)置appbar icon的顏色,appbar中icon的顏色會(huì)根據(jù)primaryColor的改變來確定自身的顏色,這里可以在iconTheme中指定icon的顏色。
默認(rèn)不做修改前:
想要在WPS表格中把漢字轉(zhuǎn)換成拼音或小寫字母,只需要運(yùn)用模塊代碼編輯功能就能輕松解決,具體操作方法如下:
步驟1、打開要轉(zhuǎn)換成拼音的excel表格,按“Alt+F11”組合鍵,進(jìn)入Visual Basic編輯狀態(tài)。也就是看到的這個(gè)灰色的編輯界面。
步驟2、執(zhí)行“插入→模塊”命令,插入一個(gè)新模塊。再雙擊插入的模塊,進(jìn)入模塊代碼編輯狀態(tài)。
步驟3、看到如下界面。
步驟4、把下面的所有內(nèi)容復(fù)制,粘貼到步驟4中的空白處。
Function?pinyin(p?As?String)?As?String
i?=?Asc(p)
Select?Case?i
Case?-20319?To?-20318:?pinyin?=?"a?"
Case?-20317?To?-20305:?pinyin?=?"ai?"
Case?-20304?To?-20296:?pinyin?=?"an?"
Case?-20295?To?-20293:?pinyin?=?"ang?"
Case?-20292?To?-20284:?pinyin?=?"ao?"
Case?-20283?To?-20266:?pinyin?=?"ba?"
Case?-20265?To?-20258:?pinyin?=?"bai?"
Case?-20257?To?-20243:?pinyin?=?"ban?"
Case?-20242?To?-20231:?pinyin?=?"bang?" ?
Case?-20230?To?-20052:?pinyin?=?"bao?"
Case?-20051?To?-20037:?pinyin?=?"bei?"
Case?-20036?To?-20033:?pinyin?=?"ben?"
Case?-20032?To?-20027:?pinyin?=?"beng?"
Case?-20026?To?-20003:?pinyin?=?"bi?"
Case?-20002?To?-19991:?pinyin?=?"bian?"
Case?-19990?To?-19987:?pinyin?=?"biao?"
Case?-19986?To?-19983:?pinyin?=?"bie?"
Case?-19982?To?-19977:?pinyin?=?"bin?"
Case?-19976?To?-19806:?pinyin?=?"bing?"
Case?-19805?To?-19785:?pinyin?=?"bo?"
Case?-19784?To?-19776:?pinyin?=?"bu?"
Case?-19775?To?-19775:?pinyin?=?"ca?"
Case?-17721?To?-17704:?pinyin?=?"he?"
Case?-17703?To?-17702:?pinyin?=?"hei?"
Case?-17701?To?-17698:?pinyin?=?"hen?"
Case?-17697?To?-17693:?pinyin?=?"heng?"
Case?-17692?To?-17684:?pinyin?=?"hong?"
Case?-17683?To?-17677:?pinyin?=?"hou?"
Case?-17676?To?-17497:?pinyin?=?"hu?"
步驟5、按下ALT+Q關(guān)閉Visual Basic編輯窗口,返回Excel編輯狀態(tài)。
步驟6、選中轉(zhuǎn)換后的拼音需要放在哪個(gè)列,例如要把B列的第2行的內(nèi)容轉(zhuǎn)換成拼音,放在D列的第2個(gè)單元格,輸入公式:=getpy(B2),這里的B2,是指源頭單元格的坐標(biāo)。
步驟7、如果要去除拼音之間的空格。去掉空格的拼音放在E列,如果這個(gè)未去掉空格的數(shù)據(jù)原來在D2單元格,去掉空格之后的拼音放在E2單元格,則在E2單元格輸:?=SUBSTITUTE(D2," ","")。
此控件比較簡(jiǎn)單,按鈕的功能可劃分為UI樣式與事件回調(diào)
這里將幾種不同的按鈕一起運(yùn)行,做下對(duì)比動(dòng)圖如下:
這里對(duì)五種按鈕進(jìn)行column居中排列如下
Text用于顯示簡(jiǎn)單樣式文本,它包含一些控制文本顯示樣式的一些屬性。
TextStyle用于指定文本顯示的樣式如顏色、字體、粗細(xì)、背景等。
TextStyle更多屬性設(shè)置如下:
如果我們需要對(duì)一個(gè)Text內(nèi)容的不同部分按照不同的樣式顯示,即富文本,這時(shí)就可以使用TextSpan,它代表文本的一個(gè)“片段”。
如上述,我們當(dāng)然也可以在上述鏈接上添加手勢(shì)事件,后續(xù)會(huì)提到。
在widget樹中,文本的樣式默認(rèn)是可以被繼承的,因此,如果在widget樹的某一個(gè)節(jié)點(diǎn)處設(shè)置一個(gè)默認(rèn)的文本樣式,那么該節(jié)點(diǎn)的子樹中所有文本都會(huì)默認(rèn)使用這個(gè)樣式,而DefaultTextStyle正是用于設(shè)置默認(rèn)文本樣式的。
舉例如下:
1、除了兩個(gè)平臺(tái)的系統(tǒng)默認(rèn)字體不一樣之外。
2、在設(shè)置字體字重(字體粗細(xì))時(shí)。
ios的字體粗細(xì)和下面截圖中的一一對(duì)應(yīng)。
安卓的w500及以下都是正常字體,安卓的w600和w700相當(dāng)于ios的w500,安卓的w800及以后都是一樣粗細(xì)。
當(dāng)我把PingFang字體文件,導(dǎo)入并使用后。
主要用到的是appbar中的brightness屬性,brightness有兩個(gè)值可取,分別是Brightness.dark和Brightness.light.
另一種方案是:就是用AnnotatedRegionSystemUiOverlayStyle包裹,
發(fā)現(xiàn)一種更靈活的辦法,如下:
只需要在最外層包裹一下,然后設(shè)置狀態(tài)欄字體顏色就可以了,可以不用appbar,更加靈活
在以前的 《Flutter 上默認(rèn)的文本和字體知識(shí)點(diǎn)》 和 《帶你深入理解 Flutter 中的字體“冷”知識(shí)》 中,已經(jīng)介紹了很多 Flutter 上關(guān)于字體有趣的知識(shí)點(diǎn),而本篇講繼續(xù)介紹 Flutter 上關(guān)于 Text 的一個(gè)屬性: FontFeature , 事實(shí)上相較于 Flutter ,本篇內(nèi)容可能和前端或者設(shè)計(jì)關(guān)系更密切 。
什么是 FontFeature ? 簡(jiǎn)單來說就是影響字體形狀的一個(gè)屬性 ,在前端的對(duì)應(yīng)領(lǐng)域里應(yīng)該是 font-feature-settings ,它有別于 FontFamily ,是用于指定字體內(nèi)字的形狀的一個(gè)參數(shù)。
我們知道 Flutter 默認(rèn)在 Android 上使用的是 Roboto 字體,而在 iOS 上使用的是 SF 字體,但是其實(shí) Roboto 字體也是分很多類型的,比如你去查閱手機(jī)的 system/fonts 目錄,就會(huì)發(fā)現(xiàn)很多帶有 Roboto 字樣的字體庫存在。
所以 Roboto 之類的字體庫是一個(gè)很大的字體集,不同的 font-weight 其實(shí)對(duì)應(yīng)著不同的 ttf ,例如默認(rèn)情況下的 Roboto 是不支持 font-weight 為 600 的配置 :
所以如下圖所示,如果我們?cè)O(shè)置了 w400 - w700 的 weight ,可以很明顯看到中間的 500 和 600 其實(shí)是一樣的粗細(xì),所以在 設(shè)置 weight 或者設(shè)計(jì) UI 時(shí),就需要考慮不同平臺(tái)上的 weight 是否支持想要的效果 。
回歸到 FontFeature 上,那 Roboto 自己默認(rèn)支持多少種 features 呢? 答案是 26 種,它們的編碼如下所示,運(yùn)行后效果也如下圖所示,從日常使用上看,這 26 種 Feature 基本滿足開發(fā)的大部分需求。
而 iOS 上的 SF pro 默認(rèn)支持 39 種 Features , 它們的編碼如下所示,運(yùn)行后效果也如下圖所示,可以看到 SF pro 支持的 Features 更多。
所以可以看到,并不是所有字體支持的 Features 都是一樣的,比如 iOS 上支持 sups 上標(biāo)顯示和 subs 下標(biāo)顯示,但是 Android 上的 Roboto 并不支持,甚至很多第三方字體其實(shí)并不支持 Features 。
有趣的是,在 Flutter Web 有一個(gè)渲染文本時(shí)會(huì)變模糊的問題 #58159 ,這個(gè)問題目前官方還沒有修復(fù),但是你可以通過給 Text 設(shè)置任意 FontFeatures 來解決這個(gè)問題。
最后,如果對(duì) FontFeature 還感興趣的朋友,可以通過一下資料深入了解,如果你還有什么關(guān)于字體上的問題,歡迎留言討論。
基于網(wǎng)友的問題再補(bǔ)充一下拓展知識(shí),畢竟這方面內(nèi)容也不多 。
事實(shí)上在 dart 里就可以看到對(duì)應(yīng) FontWeight 約定俗稱用的是字體集里的什么字體:
所以如果對(duì)于默認(rèn)字體有疑問,可以在你的手機(jī)字體找找是否有對(duì)應(yīng)的字體, 比如雖然我們說 roboto 沒有 600 ,但是如果是 roboto mono 字體集是有 600 的 fontweight ,甚至還有 600 斜體: 。
另外注意這是 Flutter 而不是原生,具體實(shí)現(xiàn)調(diào)用是在 Engine 的 paragraph_skia.cc 和 paragraph_builder_skia.cc 下對(duì)應(yīng)的 setFontFamilies 相關(guān)邏輯,當(dāng)然默認(rèn)字體庫指定在 typography.dart 下就看到,例如 'Roboto' 、 '.SF UI Display' 、 '.SF UI Text' 、 '.AppleSystemUIFont' 、 'Segoe UI' :
另外如果你在 Mac 的 Web 上使用 Flutter Web,可以看到指定的是 .AppleSystemUIFont ,而對(duì)于 .AppleSystemUIFont 它其實(shí)不算是一種字體,而是蘋果上字體的一種集合別稱:
[圖片上傳失敗...(image-40f5ce-1648368234737)]
還有,如果你去看 Flutter 默認(rèn)自帶的 cupertino/context_menu_action.dart ,就可以看到一個(gè)有趣的情況:
當(dāng)然,前面我們說了那么多,主要是針對(duì)英文的情況下,而在中文下還是有差異的 ,之前的文章也介紹過:
例如,在蘋果上的簡(jiǎn)體中文其實(shí)會(huì)是 PingFang SC 字體,對(duì)應(yīng)還有 PingFang TC 和 PingFang HK 的繁體集,而關(guān)于這個(gè)問題在 Flutter 上之前還出現(xiàn)過比較有意思的 bug :
當(dāng)然后續(xù)的 #16709 修復(fù)了這個(gè)問題 ,而在以前的文章我也講過,當(dāng)時(shí)我遇到了 “Flutter 在 iOS 系統(tǒng)上,系統(tǒng)語言是韓文時(shí),在和中文一起出現(xiàn)會(huì)導(dǎo)致字體顯示異常" 的問題 :
解決方法也很簡(jiǎn)單,就是給 fontFamilyFallback 配置上 ["PingFang SC" , "Heiti SC"] 就可以了,這是因?yàn)轫n文在蘋果手機(jī)上使用的應(yīng)該是 Apple SD Gothic Neo 這樣的超集字體庫,【廣】這個(gè)字符在這個(gè)字體集上是不存在的,所以就變成了中文的【廣】;
所以可以看到,字體相關(guān)是一個(gè)平時(shí)很少會(huì)深入接觸的東西,但是一旦涉及多語言和繪制,就很容易碰到問題的領(lǐng)域 。