HarmonyOS鸿蒙Next中Video自定义进度条
HarmonyOS鸿蒙Next中Video自定义进度条 记录一下,Video组件自带的播放控件,与实际开发中遇到的需求不一致,
需要单独放一个进度条,进行拖动,并显示对应的时间点,总体类似抖音视频可以拖动播放一样
布局方式:Stack
Video自带的播放控件样式:
思路:
-
进度条使用slider来实现。最开始我用的progress,最后发现不可以实现简单的拖动
-
再处理拿到的视频总时长,处理为mm:ss格式
效果图:↓
直接上整个代码:
interface TimeObject {
time: number;
}
interface DurationObject {
duration: number;
}
@Entry
@Component
struct Index {
@State changeTimes: string = '00.00'; // 拖动值
@State maxTime: string = '00:00' // 最大值
@State sliderTime: number = 0 // 当前进度值
@State processingTotalTime: number = 0 // 视频总长度秒数
@State isShow: boolean = false // 默认不展示数字进度
@State isPlay: boolean = true // 默认开始播放
controller: VideoController = new VideoController()
// 处理'秒'级别数据为 mm:ss 格式
processingTime = (seconds: number) => {
const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60;
return `${String(minutes).padStart(2, '0')}:${String(remainingSeconds).padStart(2, '0')}`;
}
@Builder
customVideo() {
Video({
src: $r('app.media.123'),
controller: this.controller
})
.loop(true)
.autoPlay(true)
.controls(false)
.onClick((event) => { // 点击视频本体控制暂停播放
this.isPlay = !this.isPlay
this.isPlay == true ? this.controller.start() : this.controller.pause()
console.log('this.isPlay==', this.isPlay);
})
.onPrepared((e: DurationObject) => { // 视频加载完毕
this.processingTotalTime = e.duration
this.maxTime = this.processingTime(e.duration)
})
.onFinish(() => { // 播放结束的时候
this.changeTimes = '00.00'
})
.onUpdate((e: TimeObject) => { // 播放进度变化的时候
this.sliderTime = e.time // 用于把播放进度同步到自定义进度条的当前值中
})
}
// 自定义进度条
@Builder
customProgress() {
Slider({
value: this.sliderTime,
max: this.processingTotalTime,
step: 1,
style: SliderStyle.OutSet
})
.trackColor('#191919')
.selectedColor('#fff')
.blockSize({
width: 10,
height: 10
})//设置滑块大小
.width('90%')
.onChange((value: number, mode: SliderChangeMode) => {
this.isShow = true
console.log('value==', value);
this.sliderTime = value
this.controller.setCurrentTime(value, SeekMode.Accurate)
this.changeTimes = this.processingTime(value)
console.log('this.changeTimes==', this.changeTimes);
if (mode == 2) {
this.isShow = false
}
})
}
build() {
Column() {
Stack({ alignContent: Alignment.Bottom }) {
this.customVideo()
Row() {
Text(this.changeTimes)
.fontColor('#fff')
Text('/')
.fontColor('#fff')
Text(this.maxTime)
.fontColor('#fff')
}
.margin({ bottom: 50 })
.visibility(this.isShow == false ? Visibility.Hidden : Visibility.Visible)
Text('暂停')
.fontColor('#000')
.width(40)
.height(40)
.backgroundColor(Color.Pink)
.position({ left: '50%', top: '50%' })
.translate({ x: '-50%', y: '-50%' })
.onClick(() => {
this.controller.start() // 开始播放
})
.borderRadius(50)
.backgroundColor(Color.White)
.visibility(this.isPlay == true ? Visibility.Hidden : Visibility.Visible)
}
.width('100%')
.height(500)
// 自定义进度条
Row() {
this.customProgress()
}
.width('100%')
.height(40)
.backgroundColor(Color.Black)
.justifyContent(FlexAlign.Center)
}
.height('100%')
.width('100%')
}
}
更多关于HarmonyOS鸿蒙Next中Video自定义进度条的实战教程也可以访问 https://www.itying.com/category-93-b0.html
网络视频拖动进度条,有加载完成的回调事件吗
更多关于HarmonyOS鸿蒙Next中Video自定义进度条的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
.onUpdate((e: TimeObject) => { // 播放进度变化的时候 this.sliderTime = e.time // 用于把播放进度同步到自定义进度条的当前值中 }),
在HarmonyOS鸿蒙Next中,自定义Video组件的进度条可以通过使用VideoController
和Slider
组件来实现。首先,创建一个VideoController
实例来控制视频的播放、暂停、跳转等操作。然后,使用Slider
组件来显示和调整视频的进度。
在布局文件中,可以定义一个Video
组件和一个Slider
组件。Video
组件用于播放视频,Slider
组件用于显示和调整视频的进度。通过VideoController
的onPositionUpdate
回调,可以实时更新Slider
的值,以反映视频的当前播放进度。
在代码中,可以通过VideoController
的seekTo
方法来实现视频的跳转功能。当用户拖动Slider
时,可以调用seekTo
方法,将视频跳转到指定的时间点。
此外,可以通过自定义Slider
的样式和交互行为,来满足特定的UI需求。例如,可以修改Slider
的颜色、大小、形状等,或者添加额外的交互逻辑,如双击暂停、长按快进等。
总之,在HarmonyOS鸿蒙Next中,自定义Video进度条的核心在于结合VideoController
和Slider
组件,通过实时更新和跳转功能,实现视频进度的精确控制和显示。
在HarmonyOS鸿蒙Next中,自定义Video进度条可以通过VideoPlayer
组件和Slider
组件实现。首先,使用VideoPlayer
加载视频,并通过onTimeUpdate
监听播放进度。然后,使用Slider
组件作为进度条,通过value
属性绑定当前播放时间,max
属性绑定视频总时长。通过onChange
事件实现拖动进度条时更新视频播放位置。代码示例如下:
@Entry
@Component
struct VideoPlayerExample {
private videoPlayerController: VideoPlayerController = new VideoPlayerController()
private currentTime: number = 0
private duration: number = 0
build() {
Column() {
VideoPlayer({
controller: this.videoPlayerController,
onTimeUpdate: (time) => {
this.currentTime = time.currentTime
this.duration = time.duration
}
})
Slider({
value: this.currentTime,
max: this.duration,
onChange: (value) => {
this.videoPlayerController.seek(value)
}
})
}
}
}
通过这种方式,可以灵活自定义视频进度条,并实现播放进度的同步更新。