包含flutter滾動視頻的詞條

Flutter視頻播放器,簡潔!

注:亮度調(diào)節(jié)和音量調(diào)節(jié)gif無法體現(xiàn),功能是ok的,其次默認Icon鎖的close和open實在難以分辨。

目前成都創(chuàng)新互聯(lián)公司已為近千家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)站空間、網(wǎng)站托管維護、企業(yè)網(wǎng)站設計、平遙網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

環(huán)境:Flutter 2.8.1 channel stable ;Dart 2.15.1

需要音頻播放器的看這里: Flutter音樂播放器

重點說下這個工具類,因為視頻播放,涉及到狀態(tài)改變有很多,筆者剛開始選擇使用 InheritedWidget 來在眾多的widget之間共享數(shù)據(jù)。但是總感覺這樣有點繁瑣,且不很優(yōu)雅!

這里非廣告,如果是使用 GetX 就很簡單了,筆者也使用了 GetX 進行封裝了,一瀉千里的趕腳!,但是筆者還是那句話:剛開始接觸Flutter的開發(fā)者不是很建議使用 GetX ,可以先熟悉下Flutter狀態(tài)管理的基礎原理再行使用。而且為了盡量簡潔,還是不引入其他的第三方了。

我們選擇對第三方插件進行封裝的目的不外乎這幾個:

于是筆者就寫了一個工具類 VideoPlayerUtils ,專門且只用來處理播放器的所有業(yè)務。包括暫停、播放、跳轉(zhuǎn)、調(diào)節(jié)音量、調(diào)節(jié)亮度、切換視頻等操作。在所有的widget中不會引用關(guān)于 video_player 或其他第三方插件的任何信息, VideoPlayerUtils 負責widget與播放器之間的所有操作交互。后續(xù)優(yōu)化迭代或更換播放器插件時,只需針對這個工具類進行修改,對所有widget不會有任何的影響,大大的解耦合了。

其中 VideoPlayerState :

提供以上的公共屬性,可以通過 VideoPlayerUtils 來獲取對應的值,使用 get 只讀,使外界不會誤修改這些屬性,以保證數(shù)值的安全性。開發(fā)者可根據(jù)自身需要自行添加屬性。

提供以上方法來處理播放器的所有業(yè)務。同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。

重點說下這個方法,是整個業(yè)務的核心方法,控制視頻的播放或暫停。開發(fā)者只要遇到播放或暫停是均可調(diào)用此方法,具體是播放或暫停,內(nèi)部根據(jù)傳入的 url 自行判斷,開發(fā)者不需要關(guān)心。

切換新視頻也是使用此方法,傳入的 url 與上次不一致,自動切換新視頻。筆者可根據(jù) statusListener 來監(jiān)聽播放狀態(tài)的改變,以此處理自身邏輯。

這個也需要提下,視頻播放器在播放新視頻時會異步初始化,一般我們的操作是在 initState() 初始化,成功后再 setState() 。這里筆者遇到一個讓人蛋疼的問題:

我們看 video_player 的使用:

VideoPlayer(controller) :widget中已經(jīng)持有了controller。本來筆者封裝的目的就是為了讓widget與controller的之間解耦合。但此時的筆者。。。。

放棄不是不可能放棄的,這輩子都不會放棄的!

于是筆者取了巧,寫了一個初始化監(jiān)聽器 initializedListener ,包換2個參數(shù): bool,Widget ,初始化是否成功;其中widget為初始化成功返回需要展示的播放器UI,失敗默認返回 const SizedBox() 。

到這里就可以簡單使用了:

沒看錯,視頻播放就是這么簡單。

如果有更多的業(yè)務功能,筆者也按照自己的需求寫了一套,同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。

VideoPlayerGestures 主要是處理手勢的,比如快進、快退等跳轉(zhuǎn)播放;左側(cè)上下滑動調(diào)節(jié)亮度;右側(cè)上下滑動調(diào)節(jié)音量;單擊是否開啟沉浸式播放,所有widget的隱藏與顯示;雙擊播放、暫停等。

哦,還有 PercentageWidget 也放到這個文件下了,就是這玩意:

因為顯示的百分比與手勢相關(guān),隨著手勢移動而更新。開發(fā)者可自行處理。

筆者處出于簡單考慮,就按照整個UI的位置命名了。瞅一眼就知道是啥玩意。

同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。

就是這玩意:

同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。話說這個鎖的 Icon 的open和close是真的難分辨!

就是這玩意:

同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。

這玩意是自定義的,別問,問就是跟產(chǎn)品干一架落了下風

主要就是自定義這玩意:

同樣的開發(fā)者可根據(jù)自身需要自定義。

注:這里沒有添加緩沖的進度,開發(fā)可查看 video_player 中的源碼 VideoProgressIndicator ,按業(yè)務自行定義。

這玩意就是整合以上的widget,再考慮下全屏的安全區(qū)域,沒啥東西。開發(fā)者可自行處理!

具體的實現(xiàn)監(jiān)聽器的思路, 看這里 。

自此一個漂亮的Flutter視頻播放器就已經(jīng)結(jié)束了。如果您覺得對您有些許幫助的話,歡迎 Star !

Flutter ScrollView(滾動視圖)

ScrollView 是一個帶有滾動的視圖組件。

ScrollView 由三部分組成:

ScrollView 有以下常用屬性:

注:ScrollView 是一個抽象類,通常使用 CustomScrollView。

SliverAppBar 可以實現(xiàn)背景,標題,頂部導航欄聯(lián)動,漸隱漸出動畫。

Flutter 可滾動組件 之 SingleChildScrollView (十五)

SingleChildScrollView 源碼定義如下:

需要注意的是, 通常 SingleChildScrollView 只應在期望的內(nèi)容不會超過屏幕太多時使用 ,這是因為 SingleChildScrollView 不支持基于 Sliver 的延遲加載模型,所以如果預計視口可能包含超出屏幕尺寸太多的內(nèi)容時,那么使用 SingleChildScrollView 將會非常昂貴(性能差),此時應該使用一些支持Sliver延遲加載的可滾動組件,如 ListView 。

示例1

下面是一個將大寫字母 A-Z 沿垂直方向顯示的例子,由于垂直方向空間會超過屏幕視口高度,所以我們使用SingleChildScrollView:

示例2

示例3 - 橫向滾動

本文名稱:包含flutter滾動視頻的詞條
網(wǎng)址分享:http://m.kartarina.com/article40/dseiieo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計App開發(fā)網(wǎng)站改版域名注冊微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設
主站蜘蛛池模板: 亚洲成AV人片在线观看无码 | 亚洲熟妇无码爱v在线观看| 精品一区二区三区无码视频| 无码熟妇αⅴ人妻又粗又大| 国产精品视频一区二区三区无码| 亚洲AV无码成人专区| 永久免费无码网站在线观看个| 特级做A爰片毛片免费看无码| 日韩精品久久无码人妻中文字幕| 精品久久久久久中文字幕无码| 超清无码一区二区三区| 亚洲日韩精品无码专区| 亚洲成AV人在线播放无码| 伊人久久大香线蕉无码麻豆 | 日韩人妻精品无码一区二区三区| 无码人妻丰满熟妇片毛片| 亚洲国产AV无码专区亚洲AV| av无码精品一区二区三区四区| 97久久精品无码一区二区天美| 国产精品无码无卡无需播放器| 亚洲中文字幕无码爆乳| 亚洲AV无码乱码国产麻豆| 成人无码一区二区三区| 国产免费av片在线无码免费看| 最新无码人妻在线不卡| 亚洲精品偷拍无码不卡av| 日日摸日日碰夜夜爽无码| 亚洲国产精品成人精品无码区| 国产精品无码免费专区午夜| 精品一区二区无码AV| 无码精品前田一区二区| 亚洲AV无码一区二区三区牲色| 久久久久久国产精品无码超碰| 亚洲VA中文字幕无码一二三区| 人妻少妇AV无码一区二区| 国产亚洲精久久久久久无码AV| 国产色无码专区在线观看| 野花在线无码视频在线播放| 亚洲国产成人精品无码区在线观看| 国产成人无码av| 日韩人妻无码精品久久久不卡 |