HarmonyOS鸿蒙Next中Video如何设置播放控制进度条的ui颜色

HarmonyOS鸿蒙Next中Video如何设置播放控制进度条的ui颜色

Video播放控制进度条的ui默认为白色,现在把Video背景颜色设置为白色后,播放控制进度条也是白色,看不到了,如何设置播放进度条的颜色为黑色。
5 回复

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


可以上代码看看;

在HarmonyOS Next中,设置Video组件播放控制进度条UI颜色,可通过自定义进度条样式实现。使用ProgressStyle或自定义组件,在布局中定义ProgressComponent,并设置其foregroundColor(前景色)和backgroundColor(背景色)属性来调整颜色。示例代码片段:ProgressStyle中配置progressColor为前景色,trackColor为背景色。

在HarmonyOS Next中,可以通过自定义VideoController的样式来修改进度条颜色。主要涉及修改进度条滑块(thumb)和轨道(track)的绘制属性。

以下是关键步骤和代码示例:

  1. 自定义VideoController:继承VideoController并重写其onDraw方法,或直接使用VideoController提供的属性方法进行样式设置。

  2. 设置进度条颜色:通过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的其他样式方法(如setButtonStylesetTextStyle)进行类似配置。

回到顶部