video 组件
harmonyOS 系统提供了基础的video。下面就直接上代码
原始video
新建项目 customVideo项目
本地视频
网络地址,就不用说明,只需要把地址换成网络地址即可
在resource 文件夹下的rawfile文件夹下 添加视频
在index.ets
Video({src:$rawfile("videoTest.mp4")})
.height("30%")
呈现的效果
新闻类/课程类视频
引入背景图片
在resource 文件下的base——media 中添加进背景图
添加背景图属性
Column(){
Flex() {
Video({src:$rawfile("videoTest.mp4"),previewUri:$r('app.media.preview')})
.height("30%")
}
Flex(){
Text("sss")
}
}
呈现效果
自定义播放栏
新建VideoSlider.ets
@Component
export struct VideoSlider {
@Consume isOpacity: boolean;
private controller: VideoController = new VideoController();
@Consume currentStringTime: string;
@Consume currentTime: number;
@Consume durationTime: number;
@Consume durationStringTime: string;
@Consume isPlay: boolean;
@Consume flag: boolean;
@Consume isLoading: boolean;
@Consume progressVal: number;
build() {
Row({ space: MARGIN_FONT_SIZE.FIRST_MARGIN }) {
Image(this.isPlay ? $r('app.media.ic_pause') : $r('app.media.ic_play'))
.width(IMAGE_SIZE)
.height(IMAGE_SIZE)
.margin({ left: MARGIN_FONT_SIZE.FIRST_MARGIN })
.onClick(() => {
this.iconOnclick();
})
Text(this.currentStringTime)
.fontSize(MARGIN_FONT_SIZE.SECOND_MARGIN)
.fontColor(Color.White)
.margin({ left: MARGIN_FONT_SIZE.FIRST_MARGIN })
Slider({
value: this.currentTime,
min: 0,
max: this.durationTime,
step: 1,
style: SliderStyle.OutSet
})
.blockColor($r('app.color.white'))
.width(STRING_PERCENT.SLIDER_WITH)
.trackColor(Color.Gray)
.selectedColor($r("app.color.white"))
.showSteps(true)
.showTips(true)
.trackThickness(this.isOpacity ? SMALL_TRACK_THICK_NESS : BIG_TRACK_THICK_NESS)
.onChange((value: number, mode: SliderChangeMode) => {
this.sliderOnchange(value, mode);
})
Text(this.durationStringTime)
.fontSize(MARGIN_FONT_SIZE.SECOND_MARGIN)
.margin({ right: MARGIN_FONT_SIZE.FIRST_MARGIN })
.fontColor(Color.White)
}
.opacity(this.isOpacity ? DEFAULT_OPACITY : 1)
.width(ALL_PERCENT)
.alignItems(VerticalAlign.Center)
.justifyContent(FlexAlign.Center)
}
/**
* icon onclick callback
*/
iconOnclick() {
if (this.isPlay === true) {
this.controller.pause()
this.isPlay = false;
this.isOpacity = false;
return;
}
if (this.flag === true) {
this.controller.start();
this.isPlay = true;
this.isOpacity = true;
} else {
this.isLoading = true;
// The video loading is not complete. The loading action is displayed.
let intervalLoading = setInterval(() => {
if (this.progressVal >= STACK_STYLE.PROGRESS_TOTAL) {
this.progressVal = 0;
} else {
this.progressVal += STACK_STYLE.PROGRESS_STEP;
}
}, STACK_STYLE.MILLI_SECONDS)
// The scheduled task determines whether the video loading is complete.
let intervalFlag = setInterval(() => {
if (this.flag === true) {
this.controller.start();
this.isPlay = true;
this.isOpacity = true;
this.isLoading = false;
clearInterval(intervalFlag);
clearInterval(intervalLoading);
}
}, STACK_STYLE.MILLI_SECONDS);
}
}
/**
* video slider component onchange callback
*/
sliderOnchange(value: number, mode: SliderChangeMode) {
this.currentTime = Number.parseInt(value.toString());
this.controller.setCurrentTime(Number.parseInt(value.toString()), SeekMode.Accurate);
if (mode === SliderChangeMode.Begin || mode === SliderChangeMode.Moving) {
this.isOpacity = false;
}
if (mode === SliderChangeMode.End) {
this.isOpacity = true;
}
}
}
private controller : VideoController;
Flex() {
Video({src:$rawfile("videoTest.mp4"),previewUri:$r('app.media.preview')})
.height("30%")
.controls(false)
VideoSlider({ controller: this.controller })
}