uniapp live-player横屏功能笔记
需求背景:点击全屏按钮使得原本竖屏的直播变成横屏状态,并在横屏中显示自定义的控件。
这里的需求是点击按钮进行全屏翻转,而不需要做监听翻转,所以方法相对简单一些。
开发核心点
如何横屏?
一开始我有以下两种方向
- uni.createLivePlayerContext()
- orientation:horizontal
第一种就是创建live-player上下文livePlayerContext对象,如同video的全屏一样,会铺满整个屏幕,并覆盖原来页面上的东西。
第二种则是live-player组件的属性orientation,设置画面方向,可以将画面直接变成横向播放,不会有覆盖的问题
最终选择了第一种,使用livePlayerContext进行全屏,考虑的点也有两个:
- 横屏之后面上的控件是不同的展示控件,与竖屏是相差较多,所以打算重新写布局
- 使用属性将画面横屏的话,文件流是没有翻转的,覆盖在上面的控件就会比较难写
如果说是做小程序的页面自动翻转,文件流是会翻转的,但是目前我处理的业务并不符合这个要求,所以我选择了更快速的方案
全屏展示的组件
关于全屏之后的这个控件,也有几个坑:
- 标签覆盖问题
- 单位问题
标签覆盖问题
live-player全屏之后,同级的元素是会被覆盖的,就算是使用cover-view
也无法显示,所以需要全屏时显示控件,只能写在live-player标签的内部。
<live-player>
<view>内部标签全屏时会显示</view>
</live-player>
<view>外部标签在全屏时不会显示</view>
<cover-view>外部标签cover-view在全屏时不会显示</cover-view>
单位问题
在开发时主要使用了rpx作为主要单位进行布局,然而竖屏的时候是正常的,在横屏的时候这个元素的宽高就会被拉伸,主要是感觉被横向拉长了,这应该能推测出rpx的计算跟屏幕尺寸是有关的,并不是固定的。
解决这个问题也有两个方案:
- 使用px作为单位进行布局,这样布局不会因为屏幕的翻转而改变大小,我主要是在重新编写横屏控件时使用了px进行布局。
- 使用vmin对元素宽高进行动态转换。主要是用来复用原本用rpx编写好的组件,将组件内的rpx单位转为vmin,则可以横竖屏通用。vmin这个单位是取相对于视口的宽度或高度中较小的那个,所以无论横竖都会是相同的。
将rpx转换成vmin单位我使用了scss的函数进行转换,公式如下:
@function toVmin($rpx){
@return #{$rpx * 100 / 750}vmin
}
.redpack{
// width: 355rpx; // 原本写法
width: toVmin(355); // 转换写法
}