鴻蒙Next媒體展示組件實戰:Video與動態布局全解析

今天我們來深入探討HarmonyOS Next中幾種核心媒體展示組件的使用方法,通過實際代碼示例展示如何打造豐富的多媒體體驗。

HarmonyOS Next為開發者提供了一套強大而靈活的媒體展示組件,使開發者能夠輕松實現視頻播放、動態布局適應、全屏切換等常見多媒體功能。無論是構建短視頻應用、視頻直播平臺還是內容豐富的媒體瀏覽應用,這些組件都能提供強有力的支持。

本文將重點介紹Video組件、AVPlayer與XComponent的結合使用,以及如何通過媒體查詢實現動態布局,幫助開發者快速掌握鴻蒙Next媒體開發的核心技能。

1. Video組件基礎使用

Video組件是鴻蒙多媒體系統中最常用的組件之一,它提供了開箱即用的視頻播放功能8。

1.1 基本參數配置

創建一個基礎Video組件非常簡單,以下是一個基本示例:

typescript

// Video基礎使用示例
Video({src: $rawfile('video.mp4'), // 視頻資源路徑,支持本地和網絡路徑previewUri: $r('app.media.preview'), // 未播放時的預覽圖片controller: this.videoController // 視頻控制器
})
.width('100%')
.aspectRatio(1.78) // 設置寬高比
.controls(true) // 顯示控制欄
.autoPlay(false) // 不自動播放
.loop(false) // 不循環播放
.objectFit(ImageFit.Cover) // 視頻顯示模式
.onPrepared((event) => {console.info('視頻準備完成,時長:' + event.duration + '秒');
})
.onUpdate((event) => {console.info('當前播放進度:' + event.time);
})
.onFinish(() => {console.info('視頻播放結束');
})

Video組件支持多種參數配置:8

  • src: 視頻源,支持本地路徑(如$rawfile('video.mp4'))和網絡URL

  • previewUri: 視頻未播放時顯示的預覽圖

  • controller: 視頻控制器,用于控制播放、暫停等操作

  • currentProgressRate: 播放倍速,支持0.75、1.0、1.25、1.75、2.0

1.2 視頻控制功能

通過VideoController可以實現對視頻的精確控制:8

typescript

// 創建VideoController
private videoController: VideoController = new VideoController();// 在build方法中使用
Video({src: this.videoSrc,controller: this.videoController
})// 播放控制方法
playVideo() {this.videoController.start();
}pauseVideo() {this.videoController.pause();
}stopVideo() {this.videoController.stop();
}seekTo(position: number) {this.videoController.seekTo(position);
}

2. 全屏切換功能實現

全屏切換是視頻應用中的常見需求,鴻蒙Next提供了多種實現方式。

2.1 使用Video組件內置全屏功能

Video組件提供了onFullscreenChange回調,可以輕松實現全屏切換:6

typescript

Video({src: this.videoSrc,controller: this.videoController
})
.onFullscreenChange((event) => {// 橫豎屏切換this.windowChange(event.fullscreen);
})// 全屏切換方法
windowChange(isFullscreen: boolean) {let context = getContext(this);window.getLastWindow(context).then((lastWindow) => {if (isFullscreen) {// 設置全屏lastWindow.setPreferredOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE);lastWindow.setWindowSystemBarEnable([]); // 隱藏系統欄} else {// 退出全屏lastWindow.setPreferredOrientation(window.Orientation.PORTRAIT);lastWindow.setWindowSystemBarEnable(['status', 'navigation']); // 顯示系統欄}});
}

2.2 使用AVPlayer和XComponent實現高級全屏功能

對于需要更自定義控制的場景,可以使用AVPlayer和XComponent組合:5

typescript

// 初始化AVPlayer
async initAVPlayer() {await this.release();const context = getContext(this);// 獲取資源文件描述符context.resourceManager.getRawFd(this.fileName).then(async (value) => {this.avPlayer = await media.createAVPlayer();this.avPlayer.fdSrc = {fd: value.fd,offset: value.offset,length: value.length};// 設置surfaceIdthis.setSurfaceID();});
}// 將XComponent與AVPlayer綁定
setSurfaceID() {this.avPlayer.surfaceId = this.surfaceID;
}// 全屏切換動畫
toggleFullScreen() {animateTo({duration: 300,onFinish: () => {this.isLandscape = !this.isLandscape;this.changeOrientation();}}, () => {this.isFullScreen = !this.isFullScreen;});
}// 改變屏幕方向
changeOrientation() {let context = getContext(this);window.getLastWindow(context).then((lastWindow) => {if (this.isLandscape) {// 橫屏模式lastWindow.setWindowLayoutFullScreen(true, () => {lastWindow.setWindowSystemBarEnable([]);lastWindow.setPreferredOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE);});} else {// 豎屏模式lastWindow.setPreferredOrientation(window.Orientation.UNSPECIFIED, () => {lastWindow.setWindowSystemBarEnable(['status', 'navigation'], () => {lastWindow.setWindowLayoutFullScreen(false);});});}});
}

3. 小窗口播放模式

小窗口播放是現代視頻應用的重要特性,允許用戶在瀏覽其他內容時繼續觀看視頻13。

typescript

// 小窗口播放組件
@Component
struct SmallVideoComponent {private controller: VideoController;private currentTime: number = 0;build() {Column() {Video({src: $rawfile('video.mp4'),controller: this.controller}).width(200).height(120).controls(false).objectFit(ImageFit.Cover).onUpdate((event) => {this.currentTime = event.time;})}.onClick(() => {// 點擊小窗口切換回全屏this.switchToFullScreen();})}
}// 在主頁中實現滾動時切換小窗口
@Entry@Component
struct MainPage {private scroller: Scroller = new Scroller();@State isSmallWindow: boolean = false;build() {Scroll(this.scroller) {Column() {// 主內容區域if (!this.isSmallWindow) {VideoPlayerComponent()}// 其他內容ForEach(this.contentList, (item) => {ContentItem(item)})}.onScroll(() => {// 滾動超過500vp時切換為小窗口if (this.scroller.currentOffset().yOffset > 500 && !this.isSmallWindow) {this.isSmallWindow = true;} else if (this.scroller.currentOffset().yOffset <= 500 && this.isSmallWindow) {this.isSmallWindow = false;}})}// 顯示小窗口if (this.isSmallWindow) {SmallVideoComponent().position({x: 20, y: 20})}}
}

4. 基于媒體查詢的動態布局

鴻蒙的媒體查詢模塊允許根據設備特性動態調整布局,提供響應式體驗2。

typescript

import mediaquery from '@ohos.mediaquery';// 創建媒體查詢監聽器
let resolutionListener = mediaquery.matchMediaSync('(resolution > 2dppx)');
let orientationListener = mediaquery.matchMediaSync('(orientation: landscape)');// 根據設備分辨率調整布局
resolutionListener.on('change', (mediaQueryResult) => {if (mediaQueryResult.matches) {// 高分辨率設備布局this.videoWidth = '100%';this.videoHeight = 360;this.controlsSize = 24;} else {// 低分辨率設備布局this.videoWidth = '100%';this.videoHeight = 240;this.controlsSize = 20;}
});// 根據屏幕方向調整布局
orientationListener.on('change', (mediaQueryResult) => {if (mediaQueryResult.matches) {// 橫屏布局this.isLandscape = true;this.videoWidth = '100%';this.videoHeight = '100%';} else {// 豎屏布局this.isLandscape = false;this.videoWidth = '100%';this.videoHeight = 300;}
});// 在組件中使用響應式變量
Video({src: this.videoSrc,controller: this.videoController
})
.width(this.videoWidth)
.height(this.videoHeight)
.controls(true)

5. 直播流媒體實現

鴻蒙Next同樣支持直播流媒體播放,以下是實現直播功能的關鍵代碼13:

typescript

// 直播頁面組件
@Component
struct LivePage {private liveController: VideoController = new VideoController();@State currentLive: LiveDataModel = null;@State liveList: LiveDataModel[] = [];aboutToAppear() {// 獲取直播數據this.getLiveData();}// 獲取直播數據async getLiveData() {try {this.liveList = await LiveUtils.getLiveList();if (this.liveList.length > 0) {this.currentLive = this.liveList[0];}} catch (error) {console.error('獲取直播數據失敗: ' + JSON.stringify(error));}}build() {Swiper() {ForEach(this.liveList, (liveItem) => {Column() {Video({src: liveItem.streamUrl,controller: this.liveController}).width('100%').height('100%').objectFit(ImageFit.Cover).controls(true).loop(true)// 直播疊加信息LiveOverlay(liveItem)}})}.index(this.currentIndex).autoPlay(false).indicator(false).vertical(true).onChange((index) => {// 切換直播流this.liveController.stop();this.currentLive = this.liveList[index];this.liveController.start();})}
}

6. 性能優化技巧

在媒體應用開發中,性能優化至關重要56。

6.1 使用LazyForEach懶加載

typescript

// 使用LazyForEach優化長列表性能
LazyForEach(this.liveDataSource, (liveItem: LiveDataModel) => {LiveItemComponent({ liveItem: liveItem })
}, (liveItem: LiveDataModel) => liveItem.id.toString())

6.2 組件復用優化

typescript

// 使用@Reusable裝飾器實現組件復用
@Reusable
@Component
struct VideoPlayerComponent {@Prop videoItem: VideoItem;build() {Column() {Video({src: this.videoItem.url,previewUri: this.videoItem.thumbnail}).width('100%').height(200)}}
}

總結

HarmonyOS Next提供了豐富而強大的媒體展示組件,從簡單的Video組件到高級的AVPlayer與XComponent組合,可以滿足各種多媒體應用場景的需求。通過本文介紹的幾種媒體展示組件的使用方法,開發者可以快速構建功能豐富、性能優異的媒體應用。

關鍵要點包括:135

  1. Video組件提供了開箱即用的視頻播放功能,適合大多數基本場景

  2. AVPlayer與XComponent組合提供了更高級的自定義控制能力

  3. 全屏切換可以通過Video組件內置功能或自定義實現

  4. 小窗口播放增強了用戶體驗,允許后臺播放

  5. 媒體查詢實現了響應式布局,適應不同設備特性

  6. 性能優化技術如LazyForEach和@Reusable確保了流暢體驗

鴻蒙Next的媒體能力仍在不斷發展,建議開發者定期查閱官方文檔以獲取最新功能和最佳實踐。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95006.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95006.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95006.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

復現RoboDK機器人校準功能(以Staubli TX2?90L / TX200機械臂為測試對象,實測精度接近原廠)

本算法復現了 RoboDK 的機器人校準功能&#xff1a;在訓練集的理論校準后精度與 RoboDK 一致&#xff0c;在測試集的實測精度接近 Staubli 原廠。 參考&#xff1a;RoboDK 機器人校準功能&#xff08;https://robodk.com.cn/cn/robot-calibration&#xff09; 特性 支持 SDH 參…

Vue常用指令和生命周期

Vue 是基于 MVVM模型的前端 JavaScript 框架。Vue 核心是數據驅動視圖&#xff0c;通過響應式數據實現視圖自動更新。<template><div>{{ message }}</div><button click"changeMsg">修改內容</button> </template><script se…

深度學習周報(8.25~8.31)

目錄 摘要 Abstract 1 RNN學習意義 2 RNN基礎知識 2.1 核心思想 2.2 傳播 2.3 優缺點 2.4 變體結構與應用場景 3 RNN結構代碼示例 4 總結 摘要 本周主要學習了循環神經網絡的學習意義與基礎知識&#xff0c;重點了解了RNN循環連接的核心思想、前向傳播與反向傳播過程…

借助 LAMBDA 公式,實現單元格區域高效轉換

新特性介紹 “轉換單元格&#xff08;Transform&#xff09;” 功能允許用戶將自定義的單參數 LAMBDA 公式應用于選中的單元格區域。用戶可選擇公式參數的作用域 —— 按單元格、按行、按列或按整個區域。 轉換完成后&#xff0c;源單元格區域會被清空&#xff0c;轉換后的區…

LeetCode 01背包 494. 目標和

494. 目標和給你一個非負整數數組 nums 和一個整數 target 。 向數組中的每個整數前添加 ‘’ 或 ‘-’ &#xff0c;然后串聯起所有整數&#xff0c;可以構造一個 表達式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前…

Dify 1.8.0 全網首發,預告發布

距離Dify 1.7.2過去兩周了 Dify 1.8.0 又跟大伙見面了&#xff01; 1.8.0&#xff0c;屬于主版本號不變、但第二位數字更新的“階段性大更”&#xff0c;意味著功能上的顯著優化和體驗上的重要升級。 根據官方的Github日志&#xff0c;這一版本將繼續聚焦三大核心方向&#x…

基于LangChain框架搭建AI問答系統(附源碼)

AI問答系統1. 背景知識2. 問答系統流程3. 知識問答系統相關組件3.1 文檔加載器3.2 文檔切割器3.3 嵌入模型包裝器3.4 向量存儲庫3.5 模型包裝器3.6 鏈組件4. 問答系統演示4.1 問答程序4.2 演示大模型回答效果5.問答系統代碼1. 背景知識 在人工智能技術飛速發展的今天&#xff…

【Python】QT(PySide2、PyQt5):Qt Designer,VS Code使用designer,可能的報錯

Qt designer&#xff1a;可直接在designer界面&#xff0c;使用拖拽的方式設計需要的界面&#xff0c;可設定部分屬性。安裝Pyside2后&#xff0c;designer默認在python安裝目錄的Lib/sit_packages/PySide2文件夾中。designer使用&#xff1a;① 雙擊打開designer.exe&#xff…

前端常見安全問題 + 防御方法 + 面試回答

目錄 XSS&#xff08;跨站腳本攻擊&#xff09;CSRF&#xff08;跨站請求偽造&#xff09;SQL 注入文件上傳漏洞其他前端常見安全問題面試常見問答 1. XSS&#xff08;跨站腳本攻擊&#xff09; 定義 XSS&#xff08;Cross-Site Scripting&#xff09;是一種 通過注入惡意腳…

jxWebUI--下拉選擇框

下拉選擇框提供了預先定義好的選項&#xff0c;用戶只能在這些選項中選擇輸入。 combobox 定義格式 combobox 控件名 屬性列表 ;屬性 bind 類型&#xff1a;string 缺省值&#xff1a; 輸入控件所綁定的變量名。當給輸入控件bind了一個變量名后【bindbind_var_name】&#xff0…

大模型時代:用Redis構建百億級向量數據庫方

大模型時代&#xff1a;用Redis構建百億級向量數據庫方案第一章&#xff1a;大模型時代的向量數據庫挑戰1.1 大模型時代的特征與需求1.2 向量數據庫的核心價值1.3 百億級向量的技術挑戰第二章&#xff1a;Redis作為向量數據庫的優勢2.1 Redis的核心優勢2.2 Redis向量搜索模塊&a…

jsqlparser(六):TablesNamesFinder 深度解析與 SQL 格式化實現

在數據庫應用開發中&#xff0c;SQL語句的解析和處理是一項常見而重要的任務。本文將深入探討 JSQLParser 中的 TablesNamesFinder 類&#xff0c;分析其核心原理、與 AST 訪問接口&#xff08;CCJSqlParserVisitor &#xff09;的關系、使用場景&#xff0c;并通過實際代碼示例…

Python訓練營打卡Day49-神經網絡調參指南

知識點回顧&#xff1a;隨機種子內參的初始化神經網絡調參指南 參數的分類調參的順序各部分參數的調整心得 作業&#xff1a;對于day41的簡單cnn&#xff0c;看看是否可以借助調參指南進一步提高精度。 隨機種子 import torch import torch.nn as nn# 定義簡單的線性模型&…

Elasticsearch 常用任務管理命令及實戰應用

常用任務管理命令 列出所有任務 curl -X GET "http://<es_host>:<es_port>/_tasks?detailedtrue&pretty" -H Content-Type: application/json獲取特定類型的任務 curl -X GET "http://<es_host>:<es_port>/_tasks?actions<act…

Java試題-選擇題(26)

Java試題-選擇題(26) 題目 下列有關Thread的描述,哪個是正確的 ? A:啟動一個線程的方法是:thread. run() B:結束一個線程的通常做法是:thread. stop() C:將一個線程標記成daemon線程,意味著當主線程結束,并且沒有其它正在運行的非daemon線程時,該daemon線程也會自…

緩存的原理、引入及設計

開篇寄語&#xff1a;緩存&#xff0c;你真的用對了嗎&#xff1f; 我們為什么要學習緩存呢&#xff1f;有必要學習緩存嗎&#xff1f; 緩存的使用&#xff0c;是提升系統性能、改善用戶體驗的唯一解決之道。 其實&#xff0c;作為互聯網公司&#xff0c;只要有直接面對用戶的業…

單片機如何控制模數轉換芯片

一、介紹單片機控制模數轉換&#xff08;ADC&#xff09;芯片的核心是通過通信接口發送控制指令&#xff0c;并讀取轉換后的數字信號&#xff0c;本質是“指令交互數據傳輸”的協同過程&#xff0c;具體實現需分4步完成&#xff0c;關鍵在于接口匹配和時序同步。二、核心1. 先明…

【Proteus仿真】開關控制系列仿真——開關控制LED/撥碼開關二進制計數/開關和繼電器控制燈滅

目錄 0案例視頻效果展示 0.1例子1&#xff1a;開關控制LED燈亮滅 0.2例子2&#xff1a;數碼管顯示撥碼開關二進制計數(000~255) 0.3例子3&#xff1a;開關和繼電器控制燈亮滅 1基礎知識補充 1.1 74LS245雙總線收發器 1.1.1 引腳及功能 1.1.2應用場景 1.1.3真值表 1.2…

Q1 Top IF 18.7 | 基于泛基因組揭示植物NLR進化

文章DOI: 10.1016/j.chom.2025.07.011 標題&#xff1a;Pangenomic context reveals the extent of intraspecific plant NLR evolution 期刊&#xff1a;Cell Hose & Microbe (https://i-blog.csdnimg.cn/direct/0e31f86b94d348b0a1adb084ec4e49b7.png)(https://i-blog.cs…

技術干貨|Prometheus PromQL查詢語言之聚合操作內置函數

聚合操作 Prometheus還提供了下列內置的聚合操作符,這些操作符作用域瞬時向量。可以將瞬時表達式返回的樣本數據進行聚合,形成一個新的時間序列。 sum (求和) min (最小值) max (最大值) avg (平均值) stddev (標準差) stdvar (標準差異) count (計數) count_values …