如何使用 Android 动画播放“滴答滴答”声音(可能使用“Android MediaPlayer / SoundPool”)?

Posted

技术标签:

【中文标题】如何使用 Android 动画播放“滴答滴答”声音(可能使用“Android MediaPlayer / SoundPool”)?【英文标题】:How to Play 'Tick Tick' Sound with Android Animation (possibly with `Android MediaPlayer / SoundPool`)? 【发布时间】:2020-04-06 03:30:21 【问题描述】:

我有一个自定义视图 (PieView),它有一个旋转动画。现在我想用旋转速度同步播放tick tick tick tick...声音(即旋转速度快时滴答滴答应该快,旋转慢时滴答滴答应该慢)。 为此,首先我创建了一个名为 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 一起使用,我可以接受。

【问题讨论】:

MediaPlayer 方法可能会停止工作,因为您每次都在创建一个新的 MediaPlayer 实例,并且永远不会释放它们:***.com/a/35097745。您是否尝试过使用一开始就创建的单个实例,然后每次都重放它? 我确实尝试过使用单个实例,但 ticks 听起来不太正确。所以我尝试创建新实例。但我没有释放它们。让我尝试发布 MediaPlayer。 看起来它正在工作。谢谢! :D 【参考方案1】:

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

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

【讨论】:

以上是关于如何使用 Android 动画播放“滴答滴答”声音(可能使用“Android MediaPlayer / SoundPool”)?的主要内容,如果未能解决你的问题,请参考以下文章

80后小学时期学的一首歌,里面的歌词有“滴滴滴答滴滴滴答,滴滴滴答滴滴滴答。。。。求歌名

2017年度总结

怎样将xml文件转换为html网页

喂,在吗?

我如何在 Silverlight 动画中添加声音?

在 iphone/android 上播放声音 [关闭]