王士厅

音频dialog开发抽取工具类

@@ -64,3 +64,5 @@ export { FirstTabTopSearchComponent } from "./src/main/ets/components/search/Fir @@ -64,3 +64,5 @@ export { FirstTabTopSearchComponent } from "./src/main/ets/components/search/Fir
64 export { ListHasNoMoreDataUI } from "./src/main/ets/components/reusable/ListHasNoMoreDataUI" 64 export { ListHasNoMoreDataUI } from "./src/main/ets/components/reusable/ListHasNoMoreDataUI"
65 65
66 export { LottieView } from './src/main/ets/lottie/LottieView' 66 export { LottieView } from './src/main/ets/lottie/LottieView'
  67 +
  68 +export { AudioSuspensionModel } from "./src/main/ets/viewmodel/AudioSuspensionModel"
1 -import { WDPlayerController } from 'wdPlayer'; 1 +import { WDPlayerController, PlayerConstants } from 'wdPlayer';
2 import { PaperReaderSimpleDialog } from './PaperReaderDialog'; 2 import { PaperReaderSimpleDialog } from './PaperReaderDialog';
3 import { Logger } from 'wdKit/Index'; 3 import { Logger } from 'wdKit/Index';
  4 +import { AudioSuspensionModel } from '../viewmodel/AudioSuspensionModel';
4 5
5 const TAG = 'AudioDialog'; 6 const TAG = 'AudioDialog';
6 7
7 @Preview 8 @Preview
8 @CustomDialog 9 @CustomDialog
9 export struct AudioDialog { 10 export struct AudioDialog {
  11 + @Consume audioTitle: string;
  12 + @Consume currentTime: string;
  13 + @Consume totalTime: string;
  14 + @Consume progressVal: number;
  15 + @State currentStatus: number = 0;
  16 + controllerDetail?: CustomDialogController
  17 +
10 private playerController: WDPlayerController = new WDPlayerController(); 18 private playerController: WDPlayerController = new WDPlayerController();
11 private simpleAudioDialog: CustomDialogController = new CustomDialogController({ 19 private simpleAudioDialog: CustomDialogController = new CustomDialogController({
12 builder: PaperReaderSimpleDialog({ 20 builder: PaperReaderSimpleDialog({
@@ -21,8 +29,12 @@ export struct AudioDialog { @@ -21,8 +29,12 @@ export struct AudioDialog {
21 29
22 }) 30 })
23 31
  32 + private AudioSuspension = new AudioSuspensionModel(this.simpleAudioDialog)
  33 +
  34 +
24 onCancel() { 35 onCancel() {
25 Logger.info(TAG, "cj2024 onCancel = ") 36 Logger.info(TAG, "cj2024 onCancel = ")
  37 + this.AudioSuspension.setPlayerUrl()
26 } 38 }
27 39
28 /** 40 /**
@@ -38,34 +50,92 @@ export struct AudioDialog { @@ -38,34 +50,92 @@ export struct AudioDialog {
38 } 50 }
39 51
40 build() { 52 build() {
41 - Row() {  
42 - Image($r("app.media.icon_audio_pause"))  
43 - .objectFit(ImageFit.Contain)  
44 - .margin(18)  
45 - .width(24)  
46 - .height(24)  
47 - }  
48 - .width(60)  
49 - .height(60)  
50 - .backgroundColor(Color.White)  
51 - .onClick(() => {  
52 - if (this.simpleAudioDialog) {  
53 - this.simpleAudioDialog.close()  
54 - this.simpleAudioDialog.open()  
55 - if (this.simpleAudioDialog) {  
56 - setTimeout(() => {  
57 - console.log('PaperReaderSimpleDialog delay 1s');  
58 - if (this.simpleAudioDialog != undefined) {  
59 - this.simpleAudioDialog.close()  
60 - }  
61 - if (this.simpleAudioDialog != undefined) {  
62 - this.simpleAudioDialog.open()  
63 - }  
64 - }, 500000); 53 + Stack({ alignContent: Alignment.End }) {
  54 + Column() { //标题 时间 进度条
  55 + Marquee({
  56 + start: true,
  57 + step: 5,
  58 + loop: Number.POSITIVE_INFINITY,
  59 + fromStart: true,
  60 + src: this.audioTitle
  61 + })
  62 + .width("60%")
  63 + .height(20)
  64 + .fontColor($r("app.color.color_222222"))
  65 + .fontSize(14)
  66 + .margin({ top: 10, left: 10 })
  67 + .alignSelf(ItemAlign.Start)
  68 + .onStart(() => {
  69 + console.info('Marquee animation complete onStart')
  70 + })
  71 + .onBounce(() => {
  72 + console.info('Marquee animation complete onBounce')
  73 + })
  74 + .onFinish(() => {
  75 + console.info('Marquee animation complete onFinish')
  76 + })
  77 +
  78 + Row() {
  79 + Text(this.currentTime)
  80 + .fontSize($r('app.float.font_size_12'))
  81 + .fontColor($r('app.color.color_999999'))
  82 + .height("100%")
  83 + .alignSelf(ItemAlign.Start)
  84 + Text("/" + this.totalTime)
  85 + .fontSize($r('app.float.font_size_12'))
  86 + .fontColor($r('app.color.color_999999'))
  87 + .height("100%")
  88 + .alignSelf(ItemAlign.Start)
  89 +
65 } 90 }
  91 + .width("100%")
  92 + .height(16)
  93 + .margin({ top: 4, left: 10 })
  94 +
  95 + Progress({ value: this.progressVal, total: 100, type: ProgressType.Capsule })
  96 + .color($r('app.color.color_ED2800'))
  97 + .backgroundColor($r('app.color.white'))
  98 + .width("100%")
  99 + .height(3)
  100 + .margin({ top: 7 })
66 } 101 }
  102 + .width("100%")
  103 + .height("100%")
  104 + .justifyContent(FlexAlign.Start)
67 105
68 - }) 106 + Row() {
  107 + Image(this.currentStatus != PlayerConstants.STATUS_START ? $r("app.media.icon_audio_pause") : $r("app.media.icon_audio_playing"))
  108 + .objectFit(ImageFit.Contain)
  109 + .width(24)
  110 + .height(24)
  111 + .margin({ right: 12 })
  112 + .onClick(() => {
  113 + if (this.playerController) {
  114 + // this.onConfirm()
  115 + this.playerController.switchPlayOrPause()
  116 + this.currentStatus = this.playerController.getStatus()
  117 + }
  118 + })
69 119
  120 + Image($r("app.media.icon_audio_close"))
  121 + .objectFit(ImageFit.Contain)
  122 + .width(24)
  123 + .height(24)
  124 + .onClick(() => {
  125 + if (this.playerController) {
  126 + this.playerController.stop()
  127 + }
  128 + if (this.controllerDetail) {
  129 + this.controllerDetail.close()
  130 + }
  131 + })
  132 + }.width(80)
  133 + .height(60)
  134 +
  135 + }
  136 + .width("65%")
  137 + .height(60)
  138 + .backgroundColor(Color.White)
  139 + .borderRadius(2)
70 } 140 }
71 } 141 }
  1 +import { Logger } from 'wdKit';
  2 +import { WDPlayerController } from 'wdPlayer';
  3 +
  4 +const TAG = 'AudioSuspensionModel'
  5 +
  6 +/**
  7 + * 音频悬浮窗公共方法类
  8 + */
  9 +export class AudioSuspensionModel {
  10 + public playerController: SubscribedAbstractProperty<WDPlayerController> = AppStorage.link<WDPlayerController>('playerController')
  11 + public simpleAudioDialog: CustomDialogController = {} as CustomDialogController
  12 + constructor(simpleAudioDialog: CustomDialogController) {
  13 + this.simpleAudioDialog = simpleAudioDialog
  14 +
  15 + this.initPlayerController()
  16 + }
  17 + /**
  18 + * 判断音频实例是否已存在,不存在则创建
  19 + */
  20 + private initPlayerController() {
  21 + if(this.playerController === undefined) {
  22 + Logger.info(TAG, 'playerController undefined')
  23 + AppStorage.setOrCreate('playerController', new WDPlayerController());
  24 + this.playerController = AppStorage.link<WDPlayerController>('playerController')
  25 + Logger.info(TAG, 'playerController create success')
  26 + } else {
  27 + Logger.info(TAG, 'playerController already exit')
  28 + }
  29 + }
  30 + /**
  31 + * 配置音频地址
  32 + */
  33 + public setPlayerUrl() {
  34 + // this.playerController.switchPlayOrPause()
  35 + Logger.info(TAG, 'handlePlayer')
  36 + }
  37 +
  38 + public delete() {
  39 + let res: boolean = AppStorage.delete('PropB');
  40 + Logger.info(TAG, `delete: ${res}`)
  41 + }
  42 +
  43 +
  44 +
  45 +}