Recyclerview列表視頻自動播放方案

来源:https://www.cnblogs.com/LiuZhen/archive/2023/01/15/17054491.html
-Advertisement-
Play Games

列表中自動播放視頻,常規方案是在每個 xml 中寫入視頻佈局,然後在滑動時獲取當前的下標,播放此下標的視頻 弊端:播放容易出錯,需要精準控制好停止播放操作,並且適配器中容易觸發多次刷新,導致執行多次同樣的操作,不易控制離開停止等操作,增加了佈局的負擔,影響滑動流暢度,無法復用... 使用過的都比較清 ...


列表中自動播放視頻,常規方案是在每個 xml 中寫入視頻佈局,然後在滑動時獲取當前的下標,播放此下標的視頻

弊端:播放容易出錯,需要精準控制好停止播放操作,並且適配器中容易觸發多次刷新,導致執行多次同樣的操作,不易控制離開停止等操作,增加了佈局的負擔,影響滑動流暢度,無法復用...

使用過的都比較清楚這些弊端,所以需要一套統一的播放邏輯控制,並且播放中的視頻只有一個,方便控制

大致思路就是在當前的下標佈局中,動態註入一個視頻佈局,然後去控制這個佈局的狀態,滑動時移除

優點:跟展示列表分離,容易控制,可復用,不影響列表滑動流暢度

實現流程

1、在xml中編寫好播放佈局,然後 inflate 載入佈局 videoLayout,並且綁定生命周期控制釋放,在把需要監聽的 Recyclerview 傳進來,設置好滑動監聽

2、獲取到當前下標,並且拿到該下標(viewholder)的根佈局

3、拿到該下標的實體類(播放路徑等)

4、拿到的根佈局調用系統方法  viewholderRoot.addView(videoLayout) ,把需要播放的佈局添加進 viewholder 中

5、使用 WeakReference 弱引用持有當前工具類,然後在 Handler 中去控制播放等方法

private class WeakReferenceHandler(tag: AutoPlayVideoUtils) : Handler() {
            private val mView = WeakReference(tag)
            override fun handleMessage(msg: Message) {
                when (msg.what) {
                    MSG_LOAD_VIDEO -> mView.get()?.startVideo(msg.obj as VideoData)
                }
            }
        }

6、在監聽的滑動事件中判斷可見範圍,然後移除播放佈局 videoLayout

root?.parent?.let {
            if (it is ViewGroup) {
                val video = root.findViewById<VideoPlayerView>(R.id.video_player_view)
                if (video?.isPlaying == true) {
                    video.pause()
                    video.stop()
                }
                it.removeView(root)
                videoPlayerView = null
                rootView = null
            }
        }

此時基本流程完成

實際項目中還有很多需要處理

比如滑動時如果可見下標想等,需要跳過邏輯,不用執行播放操作,然後滑動中監聽是否可見,什麼時候添加佈局跟移除佈局

比如在生命周期中恢復,暫停,釋放

所幸 Recyclerview 中有滑動停止監聽,可以很好的監聽控制


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文使用代碼 book_dict = {"price": 500, "bookName": "Python設計", "weight": "250g"} 第一種方式:使用[] book_dict["owner"] = "tyson" 說明:中括弧指定key,賦值一個value,key不存在,則是添加元 ...
  • 第二章 線程管控 主要內容: 啟動線程,並通過幾種方式為新線程指定運行代碼 等待線程完成和分離線程並運行 唯一識別一個線程 2.1 線程的基本管控 ​ main函數其本聲就是一個線程,在其中又可以啟動別的線程和設置其對應的函數入口。 2.1.1 發起線程 ​ 不管線程要執行的任務是複雜還是簡單,其最 ...
  • 作者:Hai Xiang 來源:https://www.cnblogs.com/haixiang/p/12867160.html 什麼是elasticsearch Elasticsearch 是一個開源的高度可擴展的全文搜索和分析引擎,擁有查詢近實時的超強性能。 大名鼎鼎的Lucene 搜索引擎被廣 ...
  • 1 簡介 GKE(Google Kubernetes Engine)是一個K8s平臺, 我們可以使用gcloud來創建GKE集群。在開始之前,可以查看:《初始化一個GCP項目並用gcloud訪問操作》。 2 創建GKE集群 2.1 打開API 在創建集群之前,需要打開Google API,不然無法操 ...
  • 前言 眾所周知記憶體緩存(MemoryCache)數據是從記憶體中獲取,性能表現上是最優的,但是記憶體緩存有一個缺點就是不支持分散式,數據在各個部署節點上各存一份,每份緩存的過期時間不一致,會導致幻讀等各種問題,所以我們實現分散式緩存通常會用上Redis 但如果在高併發的情況下讀取Redis的緩存,會進行 ...
  • 一般一個人的成長是分幾個階段的,具體如下: 1)剛開始參與開發階段:這個階段基礎不是很好,一邊學基礎,一邊做開發,剛開始的時候大家都是這樣,如果想快速的跳過這個階段,工具書與筆記(自己做的那種)就是速成方法了。大家一定要多辛苦敲代碼。 2)菜鳥階段:所謂菜鳥就是會做資料庫增刪改查,一般到了這個階段就 ...
  • 痞子衡嵌入式半月刊: 第 70 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 如同 STM32F103C8T6 與 CBT6 有著同樣的128K flash容量一樣, 市面上很多晶元, 同一系列的多個型號其實底下使用的是相同的硬體, 只是通過軟體, 晶元ID, 某些隱藏寄存器(例如AIR32F103)或者物理熔斷對容量進行限制. 讓我們看一看 PY32F002AF15P 這顆... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...