java - 如何使用 Android 动画播放 'Tick Tick' 声音(可能使用 `Android MediaPlayer/SoundPool` )?

标签 java android android-animation android-mediaplayer soundpool

我有一个具有旋转动画的自定义 View (PieView)。现在我想与旋转速度同步播放滴答滴答滴答...声音(即当旋转速度快时,滴答声应该快,当旋转慢时,滴答声应该快)滴答滴答应该很慢)。 为此,我首先创建了一个名为 magicbox_tick.mp3 的 mp3 文件,该文件只有一 (1) 个刻度。接下来我尝试使用 Animation.setUpdateListener() 播放声音。

首先,我尝试使用 MediaPlayer 播放音乐,但大约 10 或 15 个滴答声后,它停止了。所以现在我正在尝试 SoundPool 来播放音乐。

相关代码段如下所示:

public PieView extends View {
  // ... constructors, other methods etc
  private SoundPool soundPool;
  private int soundId;

  void init(){  // called inside those constructors
        SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        soundId = soundPool.load(getContext(), R.raw.magicbox_tick, 1);
  }

  public void rotateTo(){
    animate()..setInterpolator(new DecelerateInterpolator())
                .setDuration(mDuration)
                .setListener(someListener)
                .rotation(targetAngle)
                .setUpdateListener(animation -> {
                    myPlaySound();  // <----------------------- This is the sound playing code
                })
                .start();
  }

  void myPlaySound(){
          soundPool.play(soundId, 1, 1, 0, 0, 1); // this doesnot play the `tick` sound
          // previously I used MediaPlayer like this:
         /*
            MediaPlayer mp = new MediaPlayer.create(getContext(), R.raw.magicbox_tick);
            mp.play(); 
               // these 2 line, after some 10 ticks, stopped working. 
          */
  }

}

我从来没有做过这样的事情,我不知道如何解决这个问题。谁能帮我? 请注意,只要有效,我对所有答案都持开放态度。您不必使用 SoundPool。所以假设如果你可以让它与 android MediaPlayer 一起工作,我就同意了。

最佳答案

特别感谢Mike M先生感谢他的宝贵意见。我能够使用 MediaPlayer 修复它。应调用 MediaPlayer.release() 方法。为了使声音与角运动同步,我保留了一个 if block 来检查旋转 dTheta 是否大于容差角度。 因此,如果有人需要它,完整的代码如下所示:

public PieView extends View{
     private float omega0; // holds the previous rotation
    /**
     * @brief: plays a music using mediaPlayer
     * @input:
     * @output: void, plays a music
     * */
    private void myPlayTick() {
        float omega1 = Math.abs(getRotation());
        float dOmeda = 0;
        if(omega1>omega0){
            dOmeda = omega1 - omega0;
        }else{
            dOmeda = omega0-omega1;
        }
        if(dOmeda > threshold){
            omega0 = omega1; // update previous rotation
            final MediaPlayer mp = MediaPlayer.create(getContext(), R.raw.magicbox_tick);
            mp.start();
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    releaseMediaPlayer(mp);
                }
            });
        }
    }

    /**
     * @brief: releases mediaPlayer resource so that other mediaPlayers can use sound hardware resources
     * @input: MediaPlayer object
     * @output: void
     * */
    private void releaseMediaPlayer(MediaPlayer mediaPlayer) {
        try {
            if (mediaPlayer != null) {
                if (mediaPlayer.isPlaying())
                    mediaPlayer.stop();
                mediaPlayer.release();
                mediaPlayer = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


 public void rotateTo(){
    animate()..setInterpolator(new DecelerateInterpolator())
                .setDuration(mDuration)
                .setListener(someListener)
                .rotation(targetAngle)
                .setUpdateListener(animation -> {
                   myPlayTick();                  
                })
                .start();
  }
     // ... rest of the code, such as constructors, etc
}

关于java - 如何使用 Android 动画播放 'Tick Tick' 声音(可能使用 `Android MediaPlayer/SoundPool` )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61052536/

相关文章:

java - 如何单独验证 ListView 中多个 RadioGroup 中的选定选项?

Android: Activity 动画不起作用

android - Oreo 上的单选按钮部分未选中

java - 使用反射创建任何类型的对象

java - 从 Spring boot 单元测试中排除 Spring Cloud Config Server

java - 累加值-java-简单问题

java - 为什么 onActivityResult Intent 数据为空?

java - Java 使用 UTF-8 还是 UTF-16 编码?

java - 识别 Android 中的明确 Intent ,还是构建单独的 Activity ?

android - 我需要使用我们自己的图像而不是 Canvas 的 android 粒子动画