音频可视化剪辑功能,这边项目需要对音频进行裁剪,有没有类似的组件。效果图如下
这个还得带上传入的毫秒数,滑动时需要和时长绑定上
import { display } from '@kit.ArkUI'
import { image } from '@kit.ImageKit'
@Entry
@Component struct canvas{
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
// private img:ImageBitmap = new ImageBitmap("../../../../resources/base/media/i_trim.png")
private img:ImageBitmap = new ImageBitmap("common/photo/i_trim.png")
@State screenWidth:number=0
@State start:number=0
aboutToAppear(): void {
console.info('------>width:'+display.getDefaultDisplaySync().width)
let width=px2vp(display.getDefaultDisplaySync().width)
this.screenWidth = parseInt(width.toString())
console.log('width',this.screenWidth)
}
private offsetX: number = 0;
private offsetY: number = 0;
private currentDate: Date=new Date()
@State openFile:boolean=true
@State mCurrentOffsetX:number=0
@Builder
personalizedSignature() {
Column() {
Image($r('app.media.ic_close')).width(24).height(24).position({ x: '96%', y: 20 })
.onClick(() => {
})
Column() {
Text('左右滑动音轨选择音效片段').fontColor('#4A4C52').fontSize(14).lineHeight(14)
}.margin({ top: 24, bottom: 36 }).width('100%').alignItems(HorizontalAlign.Start)
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
// Column(){
Canvas(this.context)
.width('100%')
.height(68)
.backgroundColor('#ffff00')
.onReady(() => {
this.context.drawImage(this.img,0, 0,20,68)
this.context.drawImage(this.img,this.screenWidth-80,0,20,68)
})
.gesture(PanGesture().onActionStart(event => {
console.log('测试',event,JSON.stringify(event))
this.context.clearRect(0, 0, 20, 68);
this.currentDate = new Date();
}).onActionUpdate(event => {
console.log('测试 2'+JSON.stringify(event))
const date = new Date();
let cost =new Date().getTime() - this.currentDate.getTime();
// console.log("costtime=" + cost)
if (cost >= 150) {
this.context.clearRect(this.start, 0, 20, 68);
this.start=this.start+3
this.context.drawImage(this.img,this.start, 0,20,68)
this.currentDate = date;
}
}).onActionEnd(event => {
}))
}.width('100%')
.height(68)
}.backgroundColor($r('app.color.c_6f')).width('100%').padding({ left: 30, right: 30,bottom:50}).borderRadius(20)
}
build() {
Column(){
Image($r('app.media.ic_sound_add')).width(25).height(25).objectFit(ImageFit.Fill).onClick(() => {
this.openFile = true
}).bindSheet($$this.openFile, this.personalizedSignature(), {
detents: [SheetSize.FIT_CONTENT],
showClose: false,
enableOutsideInteractive: true,
})
}
}
}
参考下这个ui效果示例:核心逻辑在 drawClipImage