注:亮度調(diào)節(jié)和音量調(diào)節(jié)gif無法體現(xiàn),功能是ok的,其次默認(rèn)Icon鎖的close和open實(shí)在難以分辨。
天水網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
環(huán)境:Flutter 2.8.1 channel stable ;Dart 2.15.1
需要音頻播放器的看這里: Flutter音樂播放器
重點(diǎn)說下這個(gè)工具類,因?yàn)橐曨l播放,涉及到狀態(tài)改變有很多,筆者剛開始選擇使用 InheritedWidget 來在眾多的widget之間共享數(shù)據(jù)。但是總感覺這樣有點(diǎn)繁瑣,且不很優(yōu)雅!
這里非廣告,如果是使用 GetX 就很簡(jiǎn)單了,筆者也使用了 GetX 進(jìn)行封裝了,一瀉千里的趕腳!,但是筆者還是那句話:剛開始接觸Flutter的開發(fā)者不是很建議使用 GetX ,可以先熟悉下Flutter狀態(tài)管理的基礎(chǔ)原理再行使用。而且為了盡量簡(jiǎn)潔,還是不引入其他的第三方了。
我們選擇對(duì)第三方插件進(jìn)行封裝的目的不外乎這幾個(gè):
于是筆者就寫了一個(gè)工具類 VideoPlayerUtils ,專門且只用來處理播放器的所有業(yè)務(wù)。包括暫停、播放、跳轉(zhuǎn)、調(diào)節(jié)音量、調(diào)節(jié)亮度、切換視頻等操作。在所有的widget中不會(huì)引用關(guān)于 video_player 或其他第三方插件的任何信息, VideoPlayerUtils 負(fù)責(zé)widget與播放器之間的所有操作交互。后續(xù)優(yōu)化迭代或更換播放器插件時(shí),只需針對(duì)這個(gè)工具類進(jìn)行修改,對(duì)所有widget不會(huì)有任何的影響,大大的解耦合了。
其中 VideoPlayerState :
提供以上的公共屬性,可以通過 VideoPlayerUtils 來獲取對(duì)應(yīng)的值,使用 get 只讀,使外界不會(huì)誤修改這些屬性,以保證數(shù)值的安全性。開發(fā)者可根據(jù)自身需要自行添加屬性。
提供以上方法來處理播放器的所有業(yè)務(wù)。同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。
重點(diǎn)說下這個(gè)方法,是整個(gè)業(yè)務(wù)的核心方法,控制視頻的播放或暫停。開發(fā)者只要遇到播放或暫停是均可調(diào)用此方法,具體是播放或暫停,內(nèi)部根據(jù)傳入的 url 自行判斷,開發(fā)者不需要關(guān)心。
切換新視頻也是使用此方法,傳入的 url 與上次不一致,自動(dòng)切換新視頻。筆者可根據(jù) statusListener 來監(jiān)聽播放狀態(tài)的改變,以此處理自身邏輯。
這個(gè)也需要提下,視頻播放器在播放新視頻時(shí)會(huì)異步初始化,一般我們的操作是在 initState() 初始化,成功后再 setState() 。這里筆者遇到一個(gè)讓人蛋疼的問題:
我們看 video_player 的使用:
VideoPlayer(controller) :widget中已經(jīng)持有了controller。本來筆者封裝的目的就是為了讓widget與controller的之間解耦合。但此時(shí)的筆者。。。。
放棄不是不可能放棄的,這輩子都不會(huì)放棄的!
于是筆者取了巧,寫了一個(gè)初始化監(jiān)聽器 initializedListener ,包換2個(gè)參數(shù): bool,Widget ,初始化是否成功;其中widget為初始化成功返回需要展示的播放器UI,失敗默認(rèn)返回 const SizedBox() 。
到這里就可以簡(jiǎn)單使用了:
沒看錯(cuò),視頻播放就是這么簡(jiǎn)單。
如果有更多的業(yè)務(wù)功能,筆者也按照自己的需求寫了一套,同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。
VideoPlayerGestures 主要是處理手勢(shì)的,比如快進(jìn)、快退等跳轉(zhuǎn)播放;左側(cè)上下滑動(dòng)調(diào)節(jié)亮度;右側(cè)上下滑動(dòng)調(diào)節(jié)音量;單擊是否開啟沉浸式播放,所有widget的隱藏與顯示;雙擊播放、暫停等。
哦,還有 PercentageWidget 也放到這個(gè)文件下了,就是這玩意:
因?yàn)轱@示的百分比與手勢(shì)相關(guān),隨著手勢(shì)移動(dòng)而更新。開發(fā)者可自行處理。
筆者處出于簡(jiǎn)單考慮,就按照整個(gè)UI的位置命名了。瞅一眼就知道是啥玩意。
同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。
就是這玩意:
同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。話說這個(gè)鎖的 Icon 的open和close是真的難分辨!
就是這玩意:
同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。
這玩意是自定義的,別問,問就是跟產(chǎn)品干一架落了下風(fēng)
主要就是自定義這玩意:
同樣的開發(fā)者可根據(jù)自身需要自定義。
注:這里沒有添加緩沖的進(jìn)度,開發(fā)可查看 video_player 中的源碼 VideoProgressIndicator ,按業(yè)務(wù)自行定義。
這玩意就是整合以上的widget,再考慮下全屏的安全區(qū)域,沒啥東西。開發(fā)者可自行處理!
具體的實(shí)現(xiàn)監(jiān)聽器的思路, 看這里 。
自此一個(gè)漂亮的Flutter視頻播放器就已經(jīng)結(jié)束了。如果您覺得對(duì)您有些許幫助的話,歡迎 Star !
源碼分析:
分析源碼可得,TextField 是有狀態(tài) StatefulWidget,有豐富的屬性,自定義化較高,實(shí)踐中需要合理利用各種回調(diào);
1、光標(biāo)的相關(guān)屬性;cursorColor 為光標(biāo)顏色,cursorWidth 為光標(biāo)寬度,cursorRadius 為光標(biāo)圓角;其中 Radius 提供了 circle 圓角和 elliptical 非圓角兩種;
2、textAlign 為文字起始位置,可根據(jù)業(yè)務(wù)光標(biāo)居左/居右/居中等;注意只是文字開始方向;textDirection 問文字內(nèi)容方向,從左向右或從右向左;
3、maxLength 為字符長(zhǎng)度,設(shè)置時(shí)默認(rèn)是展示一行,且右下角有編輯長(zhǎng)度與整體長(zhǎng)度對(duì)比;與 maxLengthEnforced 配合,maxLengthEnforced 為 true 時(shí)達(dá)到最大字符長(zhǎng)度后不可編輯;為 false 時(shí)可繼續(xù)編輯展示有差別;
4、設(shè)置 maxLength 之后右下角默認(rèn)有字符計(jì)數(shù)器,設(shè)置 TextField.noMaxLength 即可只展示輸入字符數(shù);
5、maxLines 為允許展現(xiàn)的最大行數(shù),在使用 maxLength 時(shí)內(nèi)容超過一行不會(huì)自動(dòng)換行,因?yàn)槟J(rèn) maxLines=1,此時(shí)設(shè)置為 null 或固定展示行數(shù)即可自動(dòng)換行;區(qū)別在于 null 會(huì)展示多行,而 maxLines 最多只展示到設(shè)置行數(shù);
6、obscureText 是否隱藏編輯內(nèi)容,常見的密碼格式;
7、enableInteractiveSelection 長(zhǎng)按是否出現(xiàn)【剪切/復(fù)制/粘貼】菜單;不可為空;
8、keyboardAppearance 為鍵盤亮度,包括 Brightness.dark/light 兩種,但僅限于 iOS 設(shè)備;
9、textCapitalization 文字大小寫;理論上 sentences 為每句話第一個(gè)字母大寫;characters為每個(gè)字母大寫;words 為每個(gè)單詞首字母大寫;但該屬性僅限于 text keybord,和尚在本地更換多種方式并未實(shí)現(xiàn),有待研究;
10、keyboardType 為鍵盤類型,和尚理解整體分為數(shù)字鍵盤和字母鍵盤等;根據(jù)設(shè)置的鍵盤類型,鍵盤會(huì)有差別;
a. 數(shù)字鍵盤
--1-- datetime 鍵盤上可隨時(shí)訪問 : 和 /;
--2-- phone 鍵盤上可隨時(shí)訪問 # 和 *;
--3-- number 鍵盤上可隨時(shí)訪問 + - * /
b. 字母鍵盤
--1-- emailAddress 鍵盤上可隨時(shí)訪問 @ 和 .;
--2-- url 鍵盤上可隨時(shí)訪問 / 和 .;
--3-- multiline 適用于多行文本換行;
--4-- text 默認(rèn)字母鍵盤;
11、textInputAction 通常為鍵盤右下角操作類型,類型眾多,建議多多嘗試;
12、autofocus 是否自動(dòng)獲取焦點(diǎn),進(jìn)入頁面優(yōu)先獲取焦點(diǎn),并彈出鍵盤,若頁面中有多個(gè) TextField 設(shè)置 autofocus 為 true 則優(yōu)先獲取第一個(gè)焦點(diǎn);
13、focusNode 手動(dòng)獲取焦點(diǎn),可配合鍵盤輸入等減少用戶操作次數(shù),直接獲取下一個(gè) TextField 焦點(diǎn);
14、enabled 設(shè)為 false 之后 TextField 為不可編輯狀態(tài);
15、decoration 為邊框修飾,可以借此來調(diào)整 TextField 展示效果;可以設(shè)置前置圖標(biāo),后置圖片,邊框?qū)傩裕瑑?nèi)容屬性等,會(huì)在后續(xù)集中嘗試;若要完全刪除裝飾,將 decoration 設(shè)置為空即可;
16、inputFormatters 為格式驗(yàn)證,例如原生 Android 中通常會(huì)限制輸入手機(jī)號(hào)或其他特殊字符,在 Flutter 中也可以借此來進(jìn)行格式限制,包括正則表達(dá)式;使用時(shí)需要引入 package:flutter/services.dart;
a. LengthLimitingTextInputFormatter 限制最長(zhǎng)字符;
b. WhitelistingTextInputFormatter 僅允許輸入白名單中字符;如 digitsOnly 僅支持?jǐn)?shù)字 [0-9];
c. BlacklistingTextInputFormatter 防止輸入黑名單中字符;如 singleLineFormatter 強(qiáng)制輸入單行;
分析源碼 RegExp("[/]") 可以設(shè)置正則表達(dá)式;
17、onChanged 文本內(nèi)容變更時(shí)回調(diào),可實(shí)時(shí)監(jiān)聽 TextField 輸入內(nèi)容;
18、controller 文本控制器,監(jiān)聽輸入內(nèi)容回調(diào);
19、onTap 點(diǎn)擊 TextField時(shí)回調(diào);
20、onEditingComplete 在提交內(nèi)容時(shí)回調(diào),通常是點(diǎn)擊回車按鍵時(shí)回調(diào);
21、onSubmit 在提交時(shí)回調(diào),不可與 onEditingComplete 同時(shí)使用,區(qū)別在于 onSubmit 是帶返回值的回調(diào);
問題小結(jié):
當(dāng) TextField 設(shè)置 enableInteractiveSelection 屬性后長(zhǎng)按會(huì)出現(xiàn)菜單,默認(rèn)為英文,可通過設(shè)置 Flutter 國際化來處理;
(1)在 pubspec.yaml 中集成 flutter_localizations;
2)在 MaterialApp 中設(shè)置本地化代理和支持的語言類型;
(1)將 maxLength 設(shè)置為 null 僅使用 LengthLimitingTextInputFormatter 限制最長(zhǎng)字符;
(2)設(shè)置 InputDecoration 中 decoration 屬性為空;但是底部有空余,只是隱藏而并非消失;
當(dāng)我們同時(shí)為手機(jī)和平板適配編寫 app 針對(duì)不同屏幕尺寸進(jìn)行 UI 布局或當(dāng)用戶偏好設(shè)置較大字號(hào)或是想要最大限度等減少動(dòng)畫等;此時(shí)就需要 MediaQuery 來幫我們獲取所用設(shè)備的信息以及用戶設(shè)置的偏好信息;
MediaQuery 一直存在于 WidgetsApp 和 MaterialApp 中, MediaQuery 繼承自 InheritedWidget 是一個(gè)單獨(dú)的 Widget ,但一般通過 MediaQuery.of(context) 來獲取相關(guān)信息;
當(dāng)相關(guān)信息發(fā)生變化,例如屏幕旋轉(zhuǎn)等時(shí),屏幕中 Widget 會(huì)重新構(gòu)建,以保持最新狀態(tài);我們可以通過 MediaQuery 構(gòu)造函數(shù)和提供的靜態(tài)方法手動(dòng)設(shè)置對(duì)應(yīng)的相關(guān)信息;
MediaQueryData 包含關(guān)于媒介的相關(guān)信息;一般通過 MediaQuery.of(context) 獲??;
size 為媒介的尺寸大小,以邏輯像素為單位;
devicePixelRatio 為像素密度;與設(shè)備物理像素有關(guān),與橫豎屏等無關(guān);
orientation 為橫豎屏, Orientation.landscape 為橫屏, Orientation.portrait 為豎屏;
textScaleFactor 為
每個(gè)邏輯像素的字體像素?cái)?shù),小菜理解為字體的像素比;注意,小菜設(shè)置了默認(rèn)字體像素密度為標(biāo)準(zhǔn)的 1.2 倍之后調(diào)整設(shè)備系統(tǒng)字號(hào),其 1.2 倍依舊是以標(biāo)準(zhǔn)字號(hào)為基礎(chǔ)擴(kuò)大 1.2 倍;
platformBrightness 為當(dāng)前設(shè)備的亮度模式;注意調(diào)整屏幕亮度并不會(huì)改變?cè)撃J?,與當(dāng)前系統(tǒng)支持的黑暗模式和明亮模式相關(guān);
alwaysUse24HourFormat 為當(dāng)前設(shè)備是否為 24 小時(shí)制;
accessibleNavigation 為是否使用 TalkBack 或 VoiceOver 之類的輔助功能與應(yīng)用程序進(jìn)行交互,用以輔助視力障礙人群;
invertColors 為是否使用顏色反轉(zhuǎn),主要用于 iOS 設(shè)備;
highContrast 為用戶是否要求前景與背景之間的對(duì)比度高,主要用于 iOS 設(shè)備;
disableAnimations 為平臺(tái)是否要求禁用或減少動(dòng)畫;
boldText 為平臺(tái)是否要求使用粗體;
padding 為屏幕內(nèi)邊距,一般是劉海兒屏或異形屏中被系統(tǒng)遮擋部分邊距;
viewInsets 為鍵盤彈出時(shí)等遮擋屏幕邊距,其中 viewInsets.bottom 為鍵盤高度;
systemGestureInsets 為手勢(shì)邊距,如 Android Q 之后添加的向左滑動(dòng)關(guān)閉頁面等;
viewPadding 小菜理解為視圖內(nèi)邊距,為屏幕被劉海兒屏或異形屏中被系統(tǒng)遮擋部分,從 MediaQuery 邊界的邊緣計(jì)算;此值是保持不變;例如,屏幕底部的軟件鍵盤可能會(huì)覆蓋并占用需要底部填充的相同區(qū)域,因此不會(huì)影響此值;
physicalDepth 為設(shè)備物理層級(jí),小菜暫時(shí)還未想到對(duì)應(yīng)的應(yīng)用場(chǎng)景;
小菜在嘗試獲取其他子 Widget Size 時(shí),有兩點(diǎn)需要注意,首先要設(shè)置一個(gè)全局的 GlobalKey 來獲取當(dāng)前位置, key 需要為唯一的;第二通過 GlobalKey().currentContext 獲取 BuildContext 上下文環(huán)境,從而獲取對(duì)應(yīng)尺寸;
MediaQuery 案例嘗試
小菜對(duì)于部分 MediaQueryData 的應(yīng)用和理解還不夠深入;如有錯(cuò)誤請(qǐng)多多指導(dǎo)!
文章標(biāo)題:flutter亮度感應(yīng),flutter 屏幕常亮
路徑分享:http://jinyejixie.com/article6/dsdggig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站導(dǎo)航、小程序開發(fā)、網(wǎng)站制作、全網(wǎng)營銷推廣、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)