介绍
本示例介绍了@ohos.multimedia.media组件和@ohos.window接口实现媒体全屏的功能。 该场景多用于首页瀑布流媒体播放等。
效果图预览
使用说明:
- 点击全屏按钮,横屏媒体窗口。
- 点击恢复窗口按钮,恢复媒体窗口。
实现步骤
- 初始化@ohos.multimedia.media的AVPlayer。
async Init(): Promise<void> {
await this.release();
const context = getContext(this);
// 获取fdSrc用于注册AVPlayer
context.resourceManager.getRawFd(this.fileName).then(async (value: resourceManager.RawFileDescriptor) => {
this.avPlayer = await media.createAVPlayer();
this.isCreate = true;
this.setSourceInfo(); // 视频信息上报函数
this.setStateChangeCallback(); // 状态机上报回调函数
this.avPlayer.fdSrc = {
fd: value.fd,
offset: value.offset,
length: value.length
};
});
}
- 当AVPlayer初始化完毕进入initialized状态时,将XComponent和AVPlayer通过surfaceId绑定,这样可以在XComponent组件内实现视频播放功能。比起Video组件,AVPlayer可以更方便自定义全屏动画效果。
// TODO 知识点:XComponent和AVPlayer通过surfaceId绑定
setSurfaceID(): void {
logger.info('play video: surfaceID is:' + this.surfaceID);
this.avPlayer.surfaceId = this.surfaceID;
}
- 使用显式动画animateTo实现窗口放大效果。
// 设置全屏播放展开动画
animateTo({
duration: ANIMATE_DURATION,
onFinish: () => {
this.isLandscape = !this.isLandscape; // 设置横屏
}
}, () => {
this.isFullScreen = !this.isFullScreen;
});
- 调用@ohos.window的 getLastWindow 方法获取当前应用内最上层的子窗口,若无应用子窗口,则返回应用主窗口。
- 利用获取到的窗口对象,调用 setWindowSystemBarEnable 方法设置窗口是否显示导航栏和状态栏。
- 调用窗口对象的 setPreferredOrientation 方法设置窗口旋转方向以及是否应用重力感应。
- 调用窗口对象的setWindowLayoutFullScreen方法实现沉浸式布局。
changeOrientation() {
// 获取UIAbility实例的上下文信息
let context = getContext(this);
// 调用该接口手动改变设备横竖屏状态(设置全屏模式,先强制横屏,再加上传感器模式)
window.getLastWindow(context).then((lastWindow) => {
if (this.isLandscape) {
// 设置窗口的布局是否为沉浸式布局
lastWindow.setWindowLayoutFullScreen(true, () => {
// 设置窗口全屏模式时导航栏、状态栏的可见模式
lastWindow.setWindowSystemBarEnable([]);
// 设置窗口的显示方向属性,AUTO_ROTATION_LANDSCAPE表示传感器自动横向旋转模式
lastWindow.setPreferredOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE);
});
} else {
// 设置窗口的显示方向属性,UNSPECIFIED表示未定义方向模式,由系统判定
lastWindow.setPreferredOrientation(window.Orientation.UNSPECIFIED, () => {
// 设置窗口全屏模式时导航栏、状态栏的可见模式
lastWindow.setWindowSystemBarEnable(WINDOW_SYSTEM_BAR, () => {
// 设置窗口的布局是否为沉浸式布局
lastWindow.setWindowLayoutFullScreen(false, () => {
setTimeout(() => {
// 设置退出全屏动画
animateTo({
duration: ANIMATE_DURATION,
onFinish: () => {
this.fileName = '';
}
}, () => {
this.isFullScreen = !this.isFullScreen;
});
}, TIMEOUT_DURATION);
});
});
});
}
});
}
高性能知识点
- 本示例使用了LazyForEach 进行数据懒加载优化,以降低内存占用和渲染开销。
- 本示例使用了@Reusable复用组件优化,提升应用性能。
工程结构&模块类型
mediafullscreen // har
|---model
| |---BasicDataSource.ets // 数据类型文件
|---util
| |---TimeTools.ets // 时间轴组件页面
|---view
| |---MediaFullscreen.ets // 媒体全屏容器页面
| |---XComponentVideo.ets // AVPlayer组件页面
模块依赖
- 本实例依赖common模块来获取日志工具类logger。
最后
有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了:(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS NEXT学习资料
鸿蒙(HarmonyOS NEXT)最新学习路线
-
HarmonOS基础技能
- HarmonOS就业必备技能
- HarmonOS多媒体技术
- 鸿蒙NaPi组件进阶
- HarmonOS高级技能
- 初识HarmonOS内核
- 实战就业级设备开发
有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS NEXT学习资料
《鸿蒙 (OpenHarmony)开发入门教学视频》
《鸿蒙南向开发入门》
《鸿蒙南向开发进阶笔记》
《鸿蒙开发基础》
- ArkTS语言
- 安装DevEco Studio
- 运用你的第一个ArkTS应用
- ArkUI声明式UI开发
- .……
《鸿蒙开发进阶》
- Stage模型入门
- 网络管理
- 数据管理
- 电话服务
- 分布式应用开发
- 通知与窗口管理
- 多媒体技术
- 安全技能
- 任务管理
- WebGL
- 国际化开发
- 应用测试
- DFX面向未来设计
- 鸿蒙系统移植和裁剪定制
- ……
《鸿蒙进阶实战》
- ArkTS实践
- UIAbility应用
- 网络案例
- ……
获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS NEXT学习资料
总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。