HarmonyOS鸿蒙Next中Video如何设置播放控制进度条的ui颜色
HarmonyOS鸿蒙Next中Video如何设置播放控制进度条的ui颜色
Video播放控制进度条的ui默认为白色,现在把Video背景颜色设置为白色后,播放控制进度条也是白色,看不到了,如何设置播放进度条的颜色为黑色。
Video组件可隐藏自带控制器并自定义控制器的样式或功能。
1、隐藏自带的控制器 .controls(false) :
Video({
src: this.videoSrc,
previewUri: this.previewUri,
controller: this.controller
})
.controls(false)
2、使用Slider组件来自定义进度条:
Slider({
value: this.currentTime,
min: 0,
max: this.durationTime
})
.blockColor('#000')
.trackColor('#999')
.selectedColor('#000')
.onChange((value: number) => {
this.controller.setCurrentTime(value);
})
3、其实可保留白色进度条,在底部控制组件增加一些黑色渐变阴影。这样能保证白色背景视频,同样能看到进度条。
Row() {
Text('播放')
Slider()
Text('全屏')
}
.width('100%')
.linearGradient({
angle: 180,
colors: [['#00000000', 0], ['#92000000', 1]]
})
完整示例:
import { window } from '@kit.ArkUI';
import { AVVolumePanel } from '@kit.AudioKit';
@Entry
@Component
struct VideoControlPage {
@State videoSrc: Resource = $rawfile('video_sample3.mp4'); // 视频文件资源需要替换为本地资源
@State previewUri: Resource = $r('app.media.foreground'); // 视频封面资源需要替换为本地资源
@State currentTime: number = 0;
@State voiceValue: number = 5;
@State durationTime: number = 100;
@State play: boolean = false;
@State restTime: number = 0;
@State private isFullScreen: boolean = false;
private controller = new VideoController();
aboutToAppear(): void {
this.durationTime = 29;
}
build() {
Stack() {
Video({
src: this.videoSrc,
previewUri: this.previewUri,
controller: this.controller
})
.width('100%')
.height('100%')
.loop(false)
.controls(false)
.onFullscreenChange((event) => {
this.isFullScreen = event.fullscreen;
this.changeOrientation(this.isFullScreen);
})
.objectFit(ImageFit.Contain)
.autoPlay(false)
.id('video_news_detail')
.onPrepared((event) => {
if (event) {
this.durationTime = event.duration;
this.restTime = event.duration; // 获取视频总长
}
})
.onUpdate((event) => {
if (event) {
this.currentTime = event.time;
this.restTime = this.durationTime - event.time; // 剩余时长等于总长减去当前位置
}
});
// 音量和光亮控制器
Row() {
// voiceValue
Slider({
value: $$this.voiceValue,
min: 0,
max: 15
})
.rotate({
z: 1,
angle: -90
})
.height(150)
.width(150);
}
.margin({ bottom: this.isFullScreen ? 50 : 200 })
.width('100%')
.height(200)
.justifyContent(FlexAlign.Start)
.zIndex(1);
// 自定义的控制器
Row() {
Text(this.play ? '暂停' : '播放').onClick(() => {
this.play = !this.play;
if (this.play) {
this.controller.start(); // 开始播放
} else {
this.controller.pause(); // 暂停播放
}
}).margin(5).fontColor(Color.White)
.width('10%');
Slider({
value: this.currentTime,
min: 0,
max: this.durationTime
})
.blockColor('#000')
.trackColor('#999')
.selectedColor('#000')
.onChange((value: number) => {
this.controller.setCurrentTime(value); // 设置视频播放的进度跳转到value处
})
.width('65%');
// 展示剩余时长
Text(`${this.restTime.toString()}s`)
.width('10%')
.fontColor(Color.White);
// 修改全屏控制方法,同时删除原问题代码中Video组件的onFullscreenChange判断条件
Text(this.isFullScreen ? '退出全屏' : '全屏')
.onClick(() => {
this.isFullScreen = !this.isFullScreen;
this.changeOrientation(this.isFullScreen);
})
.width('15%')
.fontColor(Color.White);
}
.zIndex(2);
AVVolumePanel({
volumeLevel: this.voiceValue,
volumeParameter: {
position: {
x: 100,
y: 200
}
}
});
}
.align(Alignment.Bottom)
.width('100%');
}
// 更改屏幕方向landscape为true横屏,false竖屏
changeOrientation(landscape: boolean) {
window.getLastWindow(this.getUIContext().getHostContext()).then((lastWindow) => {
lastWindow.setPreferredOrientation(landscape ? window.Orientation.LANDSCAPE : window.Orientation.PORTRAIT);
});
}
}
更多关于HarmonyOS鸿蒙Next中Video如何设置播放控制进度条的ui颜色的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这个不支持改颜色的

可以参考这个代码库,摘取自己需要的部分使用;video-play:视频播放的主要工作是将视频数据转码并输出到设备进行播放,同时管理播放任务。 - AtomGit | GitCode
可以上代码看看;
在HarmonyOS Next中,设置Video组件播放控制进度条UI颜色,可通过自定义进度条样式实现。使用ProgressStyle或自定义组件,在布局中定义ProgressComponent,并设置其foregroundColor(前景色)和backgroundColor(背景色)属性来调整颜色。示例代码片段:ProgressStyle中配置progressColor为前景色,trackColor为背景色。
在HarmonyOS Next中,可以通过自定义VideoController的样式来修改进度条颜色。主要涉及修改进度条滑块(thumb)和轨道(track)的绘制属性。
以下是关键步骤和代码示例:
-
自定义
VideoController:继承VideoController并重写其onDraw方法,或直接使用VideoController提供的属性方法进行样式设置。 -
设置进度条颜色:通过
ProgressStyle来定义进度条的轨道和滑块样式。将轨道的已播放部分设置为深色(如黑色),未播放部分设置为浅色;滑块也设置为深色以确保可见性。
示例代码片段如下:
import { VideoController, ProgressStyle } from '@kit.AVKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 创建自定义的VideoController
class CustomVideoController extends VideoController {
private progressStyle: ProgressStyle = {
playedColor: '#000000', // 已播放部分颜色,设为黑色
bufferedColor: '#CCCCCC', // 缓冲部分颜色
unplayedColor: '#FFFFFF', // 未播放部分颜色,设为白色(与背景一致)
thumbColor: '#000000', // 滑块颜色,设为黑色
thumbRadius: 6, // 滑块半径
trackHeight: 4 // 轨道高度
};
aboutToAppear() {
try {
// 应用自定义的进度条样式
this.setProgressStyle(this.progressStyle);
} catch (error) {
console.error(`Failed to set progress style. Code: ${(error as BusinessError).code}, message: ${(error as BusinessError).message}`);
}
}
}
// 在UI中使用
@Entry
@Component
struct VideoExample {
private controller: CustomVideoController = new CustomVideoController();
build() {
Column() {
Video({
src: 'https://example.com/sample.mp4',
controller: this.controller
})
.backgroundColor('#FFFFFF') // 视频背景设为白色
.width('100%')
.height(300)
}
}
}
说明:
playedColor:控制已播放进度段的颜色,此处设为黑色('#000000')。unplayedColor:未播放部分的颜色,可保持为白色('#FFFFFF')以匹配背景,或调整为其他对比色。thumbColor:进度滑块的颜色,同样设为黑色以提高可见性。- 通过
setProgressStyle方法将样式应用到控制器。
这样设置后,进度条在白色背景上会显示为黑色,清晰可见。如果还需要调整其他控制元素(如播放按钮、时间文本)的颜色,可通过VideoController的其他样式方法(如setButtonStyle、setTextStyle)进行类似配置。

