2016-07-14 44 views
2

Ich arbeite mit der Mediaplayer-Klasse in Android Studio. Ich möchte einfach einen Ton ausblenden und den anderen Ton einblenden, anstatt setVolume (0,0) und setVolume (1,1) zu verwenden.Android Studio Mediaplayer zum Ein- und Ausblenden

Ich habe zwei Mediaplayer dafür erstellt und es schien, als ob ich in diesem Thread eine Lösung gefunden hätte: Android: How to create fade-in/fade-out sound effects for any music file that my app plays?, aber ich weiß nicht, wie man deltaTime benutzt.

Es gibt auch einige andere Lösungen, die ich kaum verstehen kann. Gibt es nicht eine einfache Möglichkeit, zwei Mediaplayer zu verblassen, kann ich mir nicht vorstellen, dass niemand das jemals benötigt hat oder jeder benutzt obsessiven Code, um es zu erreichen. Und wie sollte ich deltaTime verwenden?

Antwort

2

Mit Blick auf die verknüpfte example, müssten Sie fadeIn()/fadeOut() in einer Schleife aufrufen, um die Lautstärke über einen bestimmten Zeitraum zu erhöhen/verringern. deltaTime wäre die Zeit zwischen jeder Iteration der Schleife.

Sie müssten dies in einem separaten Thread von Ihrem Haupt-UI-Thread tun, damit Sie ihn nicht blockieren und zum Absturz Ihrer App führen. Sie können dies tun, indem Sie diese Schleife in ein neues Thread/Runnable/Timer einfügen.

Hier ist mein Beispiel für Verblassen in (Sie können für Ausblendung eine ähnliche Sache tun):

int volume = 0; 

private void startFadeIn(){ 
    final int FADE_DURATION = 3000; //The duration of the fade 
    //The amount of time between volume changes. The smaller this is, the smoother the fade 
    final int FADE_INTERVAL = 250; 
    final int MAX_VOLUME = 1; //The volume will increase from 0 to 1 
    int numberOfSteps = FADE_DURATION/FADE_INTERVAL; //Calculate the number of fade steps 
    //Calculate by how much the volume changes each step 
    final float deltaVolume = MAX_VOLUME/(float)numberOfSteps; 

    //Create a new Timer and Timer task to run the fading outside the main UI thread 
    final Timer timer = new Timer(true); 
    TimerTask timerTask = new TimerTask() { 
     @Override 
     public void run() { 
      fadeInStep(deltaVolume); //Do a fade step 
      //Cancel and Purge the Timer if the desired volume has been reached 
      if(volume>=1f){ 
       timer.cancel(); 
       timer.purge(); 
      } 
     } 
    }; 

    timer.schedule(timerTask,FADE_INTERVAL,FADE_INTERVAL); 
} 

private void fadeInStep(float deltaVolume){ 
    mediaPlayer.setVolume(volume, volume); 
    volume += deltaVolume; 

} 

Anstelle der Verwendung von zwei separaten Mediaplayer-Objekten, würde ich in Ihrem Fall der Verwendung nur einer und die Spur wechseln zwischen den Fades. Beispiel:

**Audio track #1 is playing but coming to the end** 
startFadeOut(); 
mediaPlayer.stop(); 
mediaPlayer.reset(); 
mediaPlayer.setDataSource(context,audiofileUri); 
mediaPlayer.prepare(); 
mediaPlayer.start(); 
startFadeIn(); 
**Audio track #2 has faded in and is now playing** 

Hope this löst Ihr Problem.

+0

Danke, das hilft, da ich noch keine andere funktionierende Lösung gefunden habe! Auch der Hinweis, dies in einem neuen Thread zu tun, ist sehr hilfreich! Vielen Dank! – olop01