README.md
1# 视频全屏切换案例
2
3### 介绍
4
5本示例介绍了[@ohos.multimedia.media](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-media-kit/js-apis-media.md)组件和[@ohos.window](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkui/js-apis-window.md)接口实现媒体全屏的功能。
6该场景多用于首页瀑布流媒体播放等。
7
8### 效果图预览
9
10<img src="./entry/src/main/resources/base/media/media_fullscreen.gif" width="300">
11
12**使用说明**:
13
14* 点击全屏按钮,横屏媒体窗口。
15* 点击恢复窗口按钮,恢复媒体窗口。
16
17## 实现步骤
18
191. 初始化[@ohos.multimedia.media](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-media-kit/js-apis-media.md)的AVPlayer。
20 ```ts
21 async init(): Promise<void> {
22 await this.release();
23 const context = getContext(this);
24 // 获取fdSrc用于注册AVPlayer
25 context.resourceManager.getRawFd(this.fileName).then(async (value: resourceManager.RawFileDescriptor) => {
26 this.avPlayer = await media.createAVPlayer();
27 this.isCreate = true;
28 this.setSourceInfo(); // 视频信息上报函数
29 this.setStateChangeCallback(); // 状态机上报回调函数
30 this.avPlayer.fdSrc = {
31 fd: value.fd,
32 offset: value.offset,
33 length: value.length
34 };
35 });
36 }
37 ```
382. 当AVPlayer初始化完毕进入initialized状态时,将XComponent和AVPlayer通过surfaceId绑定,这样可以在XComponent组件内实现视频播放功能。比起Video组件,AVPlayer可以更方便自定义全屏动画效果。
39 ```ts
40 // TODO 知识点:XComponent和AVPlayer通过surfaceId绑定
41 setSurfaceID(): void {
42 logger.info('play video: surfaceID is:' + this.surfaceID);
43 this.avPlayer.surfaceId = this.surfaceID;
44 }
45 ```
463. 使用显式动画[animateTo](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-explicit-animation.md)实现窗口放大效果。
47 ```ts
48 // 设置全屏播放展开动画
49 animateTo({
50 duration: ANIMATE_DURATION,
51 onFinish: () => {
52 this.isLandscape = !this.isLandscape; // 设置横屏
53 }
54 }, () => {
55 this.isFullScreen = !this.isFullScreen;
56 });
57 ```
584. 调用 @ohos.window 的 getLastWindow 方法获取当前应用内最上层的子窗口。若无应用子窗口,则返回应用主窗口。
59
605. 利用获取到的窗口对象,调用 setWindowSystemBarEnable 方法设置窗口是否显示导航栏和状态栏。
61
626. 调用窗口对象的 setPreferredOrientation 方法设置窗口旋转方向以及是否应用重力感应。
63
647. 调用窗口对象的setWindowLayoutFullScreen方法实现沉浸式布局。
65 ```ts
66 changeOrientation() {
67 // 获取UIAbility实例的上下文信息
68 let context = getContext(this);
69 // 调用该接口手动改变设备横竖屏状态(设置全屏模式,先强制横屏,再加上传感器模式)
70 window.getLastWindow(context).then((lastWindow) => {
71 if (this.isLandscape) {
72 // 设置窗口的布局是否为沉浸式布局
73 lastWindow.setWindowLayoutFullScreen(true, () => {
74 // 设置窗口全屏模式时导航栏、状态栏的可见模式
75 lastWindow.setWindowSystemBarEnable([]);
76 // 设置窗口的显示方向属性,AUTO_ROTATION_LANDSCAPE表示传感器自动横向旋转模式
77 lastWindow.setPreferredOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE);
78 });
79 } else {
80 // 设置窗口的显示方向属性,UNSPECIFIED表示未定义方向模式,由系统判定
81 lastWindow.setPreferredOrientation(window.Orientation.UNSPECIFIED, () => {
82 // 设置窗口全屏模式时导航栏、状态栏的可见模式
83 lastWindow.setWindowSystemBarEnable(WINDOW_SYSTEM_BAR, () => {
84 // 设置窗口的布局是否为沉浸式布局
85 lastWindow.setWindowLayoutFullScreen(false, () => {
86 setTimeout(() => {
87 // 设置退出全屏动画
88 animateTo({
89 duration: ANIMATE_DURATION,
90 onFinish: () => {
91 this.fileName = '';
92 }
93 }, () => {
94 this.isFullScreen = !this.isFullScreen;
95 });
96 }, TIMEOUT_DURATION);
97 });
98 });
99 });
100 }
101 });
102 }
103 ```
104### 高性能知识点
105
1061. 本示例使用了[LazyForEach](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-rendering-control-lazyforeach.md) 进行数据懒加载优化,以降低内存占用和渲染开销。
1072. 本示例使用了[@Reusable](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/quick-start/arkts-reusable.md)复用组件优化,提升应用性能。
108
109### 工程结构&模块类型
110
111 ```
112 mediafullscreen // har
113 |---model
114 | |---BasicDataSource.ets // 数据类型文件
115 |---util
116 | |---TimeTools.ets // 时间轴组件页面
117 |---view
118 | |---MediaFullscreen.ets // 媒体全屏容器页面
119 | |---XComponentVideo.ets // AVPlayer组件页面
120 ```
121
122### 参考资料
123
124显式动画[animateTo](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-explicit-animation.md)
125
126[LazyForEach](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-rendering-control-lazyforeach.md)
127
128[@ohos.multimedia.media](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-media-kit/js-apis-media.md)
129
130[@ohos.window](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkui/js-apis-window.md)
131
132[@Reusable](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/quick-start/arkts-reusable.md)
133
134### 依赖
135
136不涉及。
137
138### 约束与限制
139
1401.本示例仅支持标准系统上运行。
141
1422.本示例已适配API version 12版本SDK。
143
1443.本示例需要使用DevEco Studio 5.0.0 Release及以上版本才可编译运行。
145
146### 下载
147
148如需单独下载本工程,执行如下命令:
149
150```
151git init
152git config core.sparsecheckout true
153echo code/BasicFeature/Window/MediaFullScreen/ > .git/info/sparse-checkout
154git remote add origin https://gitee.com/openharmony/applications_app_samples.git
155git pull origin master
156```
157