HarmonyOS 鸿蒙Next 节拍器切换页面后,第一个声音变小,SoundPool

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 节拍器切换页面后,第一个声音变小,SoundPool

节拍器切换页面后,第一个声音变小,SoundPool

2 回复
import Metronome from './Metronome';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  private controller: TabsController = new TabsController()
  @State index: number = 0

  build() {
    Row() {
      Tabs({ barPosition: BarPosition.Start, index: this.index, controller: this.controller }) {
        TabContent() {
          Column() {
          }.backgroundColor(Color.Red)
        }.tabBar("1")

        TabContent() {
          Metronome({ currentIndex: this.index })
        }.tabBar("2")
      }.onChange((index: number) => {
        console.log(`${index}`)
        this.index = index
      })
    }
  }
}
复制
import promptAction from '@ohos.promptAction';
import { create, release, playSoundPool } from './SoundPool'

@Component
export default struct Metronome {
  @State isWorkerStart: boolean = false // 线程是否开启
  @State loopBeat: number | null = null // 闪烁延时器
  @State isTwinkleOn: boolean = true // 是否半屏闪烁
  @State isTwinkleOnText: string = '半屏闪烁' // 半屏闪烁文字
  @State beatCount: number = 4 // 节拍数
  @State beatSpeedList: string[] = this.generateBeatSpeedList() // 节拍速度数组
  @State select: number = 40 // 选中的节拍数下标
  @State selectValue: number = 80 // 选中的节拍数
  @State isPlay: boolean = false // 播放、暂停
  @State toneNum: number = 4 // 音调数
  @State isActiveBeatCount: number = 0 // 当前节拍数高亮
  @State isActiveBeatBg: boolean = false // 半屏闪烁高亮
  @State workerCode: number = 1 // 线程退出code
  @Prop @Watch('onCurrentIndexChange') currentIndex: number = 1; // tabs下标

  aboutToAppear() {
    // this.createSoundPool();
  }

  aboutToDisappear() {
    console.log('ceshiceshi')
    // this.cancelSoundPool()
    // this.cancelSoundPool().then(() => {
    //   this.cancelLoopBeatCount()
    // });
  }

  build() {
    Column() {
      // 跳转到设置
      Row() {
        Button("paly").onClick(() => {
          this.playAudio()
        })
      }
      .width('100%')
      .height('50vp')
      .justifyContent(FlexAlign.SpaceBetween)
      .alignItems(VerticalAlign.Center)
      .padding({ left: '35vp', right: '35vp' })
      .margin({ top: '15vp' })
    }
    .width('100%')
    .height('100%')
  }

  // 监听tabs下标变化
  onCurrentIndexChange() {
    console.log(this.currentIndex + 'val1133')
    if (this.currentIndex === 1) {
      this.createSoundPool();
    } else {
      console.log(`${this.currentIndex}`)
      this.cancelSoundPool()
    }
  }

  // 创建音频池
  async createSoundPool() {
    await create();
  }

  // 释放音频池
  async cancelSoundPool() {
    await release();
  }

  // 生成节拍速度数组
  generateBeatSpeedList() {
    let beatSpeedList: Array<string> = []
    for (let i = 40; i <= 218; i++) {
      beatSpeedList.push(`${i}`)
    }
    return beatSpeedList
  }

  // 播放节拍器声音
  async playAudio() {
    await playSoundPool()
  }

  // 节拍数处理
  handleTextPickerChange(value: string | string[]) {
    this.selectValue = Number(value)
  }

  // 处理是否半屏闪烁
  handleSwitchChange(isOn: boolean) {
    this.isTwinkleOn = isOn
  }

  // 动态节拍宽度
  dynamicBeatWidth(count: number) {
    let width = '20%'
    if (count == 2) {
      width = '48%'
    } else if (count == 3) {
      width = '30.6%'
    } else if (count == 4) {
      width = '22%'
    } else if (count == 5) {
      width = '16.8%'
    } else if (count == 6) {
      width = '13.3%'
    } else if (count == 7) {
      width = '10.8%'
    } else if (count == 8) {
      width = '9%'
    }
    return width
  }

  // 节拍器处理
  handleBeatCountClick() {
    if (this.isPlay) {
      promptAction.showToast({
        message: '请先暂停播放',
        duration: 2000,
        bottom: '50vp'
      });
      return
    } else {
      this.beatCount++
      if (this.beatCount > 8) {
        this.beatCount = 2
      }
    }
  }

  // 音符数处理
  handleTuneNumClick() {
    if (this.isPlay) {
      promptAction.showToast({
        message: '请先暂停播放',
        duration: 2000,
        bottom: '50vp'
      });
      return
    } else {
      this.toneNum = this.toneNum > 4 ? 1 : this.toneNum * 2;
    }
  }

  // 节拍器闪烁
  handleLoopBeatCount() {
    this.isActiveBeatBg = !this.isActiveBeatBg
  }

  // 判断节拍器半屏闪烁是否高亮
  judgeIsActiveBeatBg(idx: number) {
    if (idx === this.isActiveBeatCount) {
      return true
    } else {
      return false
    }
  }
}

更多关于HarmonyOS 鸿蒙Next 节拍器切换页面后,第一个声音变小,SoundPool的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,针对Next节拍器应用切换页面后第一个声音变小的问题,如果涉及到SoundPool的使用,这通常与SoundPool的资源管理和音频焦点处理有关。

SoundPool主要用于播放短音效,如按钮点击声、游戏音效等。当应用切换页面时,系统可能会调整音频焦点或资源分配,导致音效的音量发生变化。具体来说,如果切换页面时系统回收了部分资源或改变了音频焦点,再次播放音效时可能会因为资源不足或焦点优先级降低而导致音量变小。

为了解决这个问题,可以尝试以下方法:

  1. 确保音频焦点:在播放音效前,申请并维护音频焦点,确保音效播放时具有合适的焦点级别。
  2. 资源管理:优化SoundPool的资源管理,避免资源泄漏,确保在切换页面时SoundPool能够正确释放和重新加载资源。
  3. 音效预处理:对于重要的音效,可以提前加载并缓存,以减少切换页面时的加载延迟和资源分配问题。

如果上述方法无法解决问题,可能是由于系统级别的音频管理策略导致的。此时,建议检查系统日志或联系设备制造商获取更多信息。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部