/*
* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import emitter from '@ohos.events.emitter';
import { VideoDetailInfo } from '../appsampled/data/SearchResult';
import AVPlayerModel from '../model/AVPlayerModel'
import Constant from '../utils/Constant';
import Logger from '../utils/Logger';
const TAG: string = '[SearchPlayVideoComponent]';
@Component
export default struct SearchPlayVideoComponent {
private videoDetailInfo?: VideoDetailInfo;
private xComponentController: XComponentController = new XComponentController();
private avPlayerModel: AVPlayerModel = new AVPlayerModel(getContext(this));
@State surfaceId: string = '-1';
@State isPlay: boolean = false;
@State isInit: boolean = false;
aboutToAppear() {
// 监听暂停事件,当有其他音乐播放时当前播放
emitter.on({ eventId: Constant.EVENT_PAUSED_VIDEO }, data => {
Logger.info(TAG, `emitter on data = ${JSON.stringify(data)}`)
if (data) {
// 拿出传过来的ID
let videoDetailId: number = data.data?.videoDetailId;
Logger.info(TAG, `emitter on data videoId= ${JSON.stringify(videoDetailId)}`)
// 不与当前ID相同则暂停,规避自身也会暂停的问题
if (videoDetailId && videoDetailId !== this.videoDetailInfo?.videoDetailId) {
Logger.info(TAG, `emitter on data this.isPlay= ${JSON.stringify(this.isPlay)}`)
if (this.isPlay) {
this.avPlayerModel.paused();
this.isPlay = false;
}
}
}
});
}
build() {
Column() {
// 作者信息
Row({ space: 8 }) {
Image($r('app.media.app_icon'))
.width(48)
.height(48)
.objectFit(ImageFit.Contain)
.borderRadius(24)
Column({ space: 5 }) {
Text(this.videoDetailInfo?.videoDetailAuthorName)
.height(18)
.fontColor($r('app.color.COLOR_FFFFFF'))
.fontSize(18)
.fontFamily($r('app.string.Font_family_medium'))
.textAlign(TextAlign.Start)
Text(this.videoDetailInfo?.videoDetailTime)
.height(18)
.fontColor($r('app.color.COLOR_CCFFFFFF'))
.fontSize(14)
.fontFamily($r('app.string.Font_family_regular'))
.textAlign(TextAlign.Start)
}
.height(80)
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Start)
Blank()
Image($r('app.media.app_icon'))
.width(22)
.height(30)
.objectFit(ImageFit.Contain)
.margin({ right: 5 })
}
.width('100%')
.height(70)
// 视频Title
Column({ space: 5 }) {
Text(this.videoDetailInfo?.videoDetailTitle)
.fontColor($r('app.color.COLOR_FFFFFF'))
.fontSize(18)
.fontFamily($r('app.string.Font_family_regular'))
.textAlign(TextAlign.Start)
.textOverflow({ overflow: TextOverflow.Ellipsis })
Text(this.videoDetailInfo?.videoDetailLabel)
.fontColor($r('app.color.COLOR_EEC934'))
.fontSize(18)
.maxLines(3)
.fontFamily($r('app.string.Font_family_regular'))
.textAlign(TextAlign.Start)
.textOverflow({ overflow: TextOverflow.Ellipsis })
}
.width('100%')
.height(60)
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Start)
// 视频
Stack() {
XComponent({
id: 'xComponentId',
type: 'surface',
controller: this.xComponentController
})
.onLoad(() => {
Logger.info(TAG, 'onLoad is called')
this.xComponentController.setXComponentSurfaceSize({ surfaceWidth: 640, surfaceHeight: 480 })
this.surfaceId = this.xComponentController.getXComponentSurfaceId()
Logger.info(TAG, `onLoad surfaceId: ${this.surfaceId}`)
})
.height('100%')
.width('100%')
.borderRadius(14)
Row() {
Image(this.isPlay ? $r('app.media.app_icon') : $r('app.media.app_icon'))
.width(24)
.height(24)
.objectFit(ImageFit.Contain)
}
.width(56)
.height(56)
.justifyContent(FlexAlign.Center)
.onClick(e => {
Logger.info(TAG, `onClick this.isPlay= ${JSON.stringify(this.isPlay)}`)
// 播放的视频点击则暂停
if (this.isPlay) {
this.avPlayerModel.paused();
} else {
// 播放当前视频时发送事件暂停其他视频播放事件
emitter.emit({ eventId: Constant.EVENT_PAUSED_VIDEO }, {
data: {
'videoDetailId': this.videoDetailInfo?.videoDetailId
}
});
// 第一次点击播放先初始化音乐
if (!this.isInit) {
this.avPlayerModel.avPlayerFdSrcDemo(this.videoDetailInfo?.videoDetail, this.surfaceId);
this.isInit = !this.isInit;
} else {
Logger.info(TAG, `onClick Play= ${JSON.stringify(this.isInit)}`)
// 初始化过的直接播放
this.avPlayerModel.play();
}
}
this.isPlay = !this.isPlay;
})
}
.width('100%')
.height(300)
.alignContent(Alignment.BottomEnd)
// 视频点赞等信息
Row() {
this.Item($r('app.media.app_icon'), this.videoDetailInfo?.videoDetailLike)
this.Item($r('app.media.app_icon'), this.videoDetailInfo?.videoDetailComment)
this.Item($r('app.media.app_icon'), this.videoDetailInfo?.videoDetailCollect)
this.Item($r('app.media.app_icon'), this.videoDetailInfo?.videoDetailTransmit)
}
.width('100%')
.height(50)
.padding({ left: 10, right: 10 })
.justifyContent(FlexAlign.SpaceBetween)
// 视频具体评论信息
Row({ space: 8 }) {
Image($r('app.media.app_icon'))
.width(36)
.height(36)
.objectFit(ImageFit.Contain)
.borderRadius(18)
Column({ space: 5 }) {
Text(this.videoDetailInfo?.commenterName)
.height(18)
.fontColor($r('app.color.COLOR_FFFFFF'))
.fontSize(18)
.fontFamily($r('app.string.Font_family_medium'))
.textAlign(TextAlign.Start)
Text(this.videoDetailInfo?.commenterContent)
.height(18)
.fontColor($r('app.color.COLOR_CCFFFFFF'))
.fontSize(14)
.fontFamily($r('app.string.Font_family_regular'))
.textAlign(TextAlign.Start)
}
.height(60)
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Start)
Blank()
Column() {
Image($r('app.media.app_icon'))
.width(22)
.height(30)
.objectFit(ImageFit.Contain)
Text(this.videoDetailInfo?.commenterLike)
.height(18)
.fontColor($r('app.color.COLOR_CCFFFFFF'))
.fontSize(14)
.fontFamily($r('app.string.Font_family_regular'))
.textAlign(TextAlign.Start)
}
.width(48)
.height(48)
.justifyContent(FlexAlign.Center)
}
.width('100%')
.height(70)
.padding({ left: 10, right: 10 })
}
.width('100%')
.height(550)
.backgroundColor($r('app.color.COLOR_151724'))
}
@Builder
Item(img: Resource, num: string) {
Row({ space: 8 }) {
Image($r('app.media.app_icon'))
.width(24)
.height(24)
.objectFit(ImageFit.Contain)
Text(num)
.fontColor($r('app.color.COLOR_FFFFFF'))
.fontSize(16)
.fontFamily($r('app.string.Font_family_regular'))
.textAlign(TextAlign.Center)
}
.width(64)
.height(48)
.justifyContent(FlexAlign.Center)
}
}