11_17日项目笔记——制作“全屏播放页面”
创建项目:
项目需求:要实现的页面效果
使用相对布局(Relative):
所需图片资源需要请点击我https://download.csdn.net/download/m0_73992525/90009094?spm=1001.2014.3001.5503
修改默认启动页面
此时应用启动默认加载首页Index.ets,要将其修改于一下,让其默认加载‘全屏播放页面’
在“FullscreePlay”页面即将显示时,将屏幕横屏过来
1、将屏幕设置为全屏
设置全屏前:
设置全屏后:
前后对比:
2、将屏幕设置为横屏
内容方面:
首选相对布局:
相对容器的使用方法:
相对布局官方指导文档点我!
设置锚点
做微调的方式:
- 使用margin(外边距)做微调,会影响周围兄弟元素
- 使用offset,不会影响周围的兄弟元素,起点为自己的默认设置,移走后,不释放所占的空间
- 使用position(绝对定位)--- 起点为父容器的左上角,移走后释放所占的空间
使用Video
1、静态页面设计:
背景视频
先用Row代替,设置背景颜色
播放/暂停按钮
顶部的后退按钮+标题+更多
底部播放控制条
注意:progress默认宽度为100%,会导致一行内容溢出,使用layoutweight()布局权重,此时为收缩
添加小圆饼(在进度条上)
相对容器会随着页面滚动而滚动,stack(层叠布局不会随着页面滚动而滚动!)
progress进度条与小圆饼是一起的,所以要在一个容器中,可用将他们两个放入一个容器,用Row更简单!
记住:此时进度条的权重就不是加给Progress,而是加给外层的Row组件。
如何调整小圆饼位置:
做微调的方式:
- 使用margin(外边距)做微调,会影响周围兄弟元素
- 使用offset,不会影响周围的兄弟元素
使用position(绝对定位)
最外层背景颜色改为黑色:
使用position更合适,可以使其向上走一点
完整代码:
// 底部的播放控制条
Row({space:15}){
// 进行时长
Text('03:23')
.fontColor('#fff')
// 进度条
Row(){
// 进度条
Progress({
value:50
})
.backgroundColor('#fff') //背景色,未进行的进度条颜色
.color('#E89E42') //进行过的进度条颜色
// 小圆饼
Row()
.width(20)
.height(20)
.borderRadius(50)
.backgroundColor('#fff')
// .offset({x:-60,y:0}) //①margin②offset(起点为自己的默认位置)③position
.position({x:0,y:-8})
}.layoutWeight(1)
最
静态页面基本完成:
完整代码:
import { window } from '@kit.ArkUI'
@Entry
@Component
struct Demo1 {
async aboutToAppear(){
let w = await window.getLastWindow(getContext())
w.setWindowLayoutFullScreen(true)
w.setPreferredOrientation(window.Orientation.LANDSCAPE)
}
build() {
RelativeContainer(){
//最底部视频
Row(){}
.width('100%')
.height('100%')
// .backgroundColor('#000')
// 顶部的后退按钮+标题+更多
Row(){
// 返回按钮
Image('/images/back.svg')
.width(9)
// 文本
Text('Axure RP9教程:手把手教你制作交互案例')
.fontColor('#fff')
.layoutWeight(1) //布局权重为1,占用剩余 所有的剩余空间
.margin({left:20})
// 更多按钮
Image('/images/more.svg')
.width(20)
.fillColor('#fff')
}
.width('100%')
.padding({left:20,right:20,top:20})
// 播放/暂停按钮
Image('/images/play2.svg')
.width(50)
.height(50)
.alignRules({
middle:{anchor:'__container__',align:HorizontalAlign.Center},
center:{anchor:'__container__',align:VerticalAlign.Center}
})
// 底部的播放控制条
Row({space:15}){
// 进行时长
Text('03:23')
.fontColor('#fff')
// 进度条
Row(){
// 进度条
Progress({
value:50
})
.backgroundColor('#fff') //背景色,未进行的进度条颜色
.color('#E89E42') //进行过的进度条颜色
// 小圆饼
Row()
.width(20)
.height(20)
.borderRadius(50)
.backgroundColor('#fff')
// .offset({x:-60,y:0}) //①margin②offset(起点为自己的默认位置)③position
.position({x:0,y:-8})
}.layoutWeight(1)
// 总时长
Text('05:31')
.fontColor('#fff')
// 清晰度
Text('标清')
.fontColor('#fff')
//收缩
Image('/images/zoomin.svg')
.width(15)
}
.width('100%')
.padding({left:20,right:20,bottom:20})
.alignRules({
bottom:{anchor:'__container__',align:VerticalAlign.Bottom}
})
}
.height('100%')
.width('100%')
.backgroundColor('#fdd')
}
}
2、动态页面设计:
(1)最底部的视频播放
Video组件官方文档,想看点我!
video相关属性想看点我
1、videooptions对象
2、要想视频能够播放需要申请权限
3、解决默认显示video组件中自带的播放灯等按钮
使用属性
.controls(false) //是否显示默认提供的播放组件
解决默认显示video组件中自带的播放灯等按钮
4、video组件天然不支持后台播放
5、文字无法完全显示,宽高比不一致!
objectfit属性
imagefix枚举类型
(2)控制其播放暂停按钮
(3)获得“播放总时长”和“播放总进度”
1、获取播放总时长
2、获取播放总进度:
3、将“播放总时长”和“播放总进度”的时间打印出来
将原本固定静态的文本框,用“播放总时长”和“播放总进度”替换为状态变量!
(4)进度条随进度条改变
1、进度条进度
2、小圆饼
(5)提供视频回放的进度(可以在任一点播放)
问题:
①没法进入后台播放
②视频播放时长单位为秒,进度条一秒钟才能走一步,太慢了。
③video无法实现弹幕效果
video只能做一些简单的视频播放。
video不能在视频中放一些复杂的东西(追加在视频上的内容,如弹幕、礼物),做不了网络直播
要想实现------》用AVPlayer
使用AVPlayer
AVPlayer是对象,不是页面中的UI组件
开发步骤:
① 调用createAVPlayer()创建AVPlayer实例,初始化进入idle状态
把video换掉,换用一个可以播放视频的组件Xcomponent(可理解为一个画布,画布可以绘制任何类型,
都用XComponent例如:
像绘制月牙形的按钮,就需要自己绘制。
游戏领域
美颜相机,带一个头饰,周围有东西,将拍的东西做绘图处理,就需要xcomponnet。
视频播放,想实现弹幕等就需要Xcomponent)
文档中心
先删除video组件
添加Xcomponent组件
创建AVPlayer
解决方式:
② 设置业务需要的监听事件,搭配全流程场景使用,如:stateChange、error等
创建监听事件 .on
③ 设置资源:设置属性url,AVPlayer进入initialized状态
视频播放来源可能是如下情形:
1.本地资源播放:必须确认资源文件可用,并使用应用沙箱路径访问对应资源
2. 网络播放路径:需声明权限 ohos.permission.INTERNET
3. HAP包中的资源路径:使用ResourceManager.getRawFd打开HAP资源文件描述符
只有指定URL,才能使状态机发生改变
④ 设置窗口:获取并设置属性SurfaceID,用于设置显示画面;应用需要从XComponent组件获取surfaceID
⑤ 准备播放(prepared就绪态):调用prepare(),AVPlayer进入prepared状态,此时可以获取duration(总时长),设置缩放模式、音量等
⑥ 视频播控(playing播放态):播放play(),暂停pause(),跳转seek(),停止stop() 等操作
进入播放状态: