2016-10-13 7 views
0

ちょうどJavaを学び始めました。私は現在、いくつかのメディア基本的なことを学んでいます。 ボリュームコントローラーのシークバー、再生、停止ボタンがうまく動作する小さなアプリケーション(音楽ファイルを再生する)を作成しました。私はその時点まで音楽を再生し、進行状況はバーの更新を求め、曲が再生されているときに必要なように右に移動します。実際に音楽の進行状況を変更できるコードを追加する場合は、シークが更新されるたびに(1000ミリ秒/ 1秒ごとに)ポーズ(遅延)が発生します。私はコードにAndroidオーディオシークバーの遅延

mplayer.seekTo(progress); 

を追加した場合、私は音楽遅延たびにシークバーの更新(毎秒)を取得します。

package com.dionisie.sounddemo; 

import android.content.Context; import android.media.AudioManager; 
import android.support.v7.app.AppCompatActivity; import 
android.os.Bundle; import android.media.MediaPlayer; import 
android.view.View; import android.widget.SeekBar; import 
android.widget.SeekBar.OnSeekBarChangeListener; import 
android.util.Log; 

import java.util.Timer; import java.util.TimerTask; 

public class MainActivity extends AppCompatActivity { 

    MediaPlayer mplayer; 

    AudioManager audioManager; 

    public void playAudio(View view) { 
     mplayer.start(); 
    } 


    public void pauseAudio(View view) { 
     mplayer.pause(); 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mplayer = MediaPlayer.create(this, R.raw.joanna); 

     audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     int curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 

     SeekBar volumeControl = (SeekBar) findViewById(R.id.seekBar); 
     volumeControl.setMax(maxVolume); 
     volumeControl.setProgress(curVolume); 

     volumeControl.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

       audioManager.setStreamVolume(audioManager.STREAM_MUSIC, progress, 0); 

      } 
     }); 


     final SeekBar scrubber = (SeekBar) findViewById(R.id.scrubber); 

     scrubber.setMax(mplayer.getDuration()); 

     new Timer().scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       scrubber.setProgress(mplayer.getCurrentPosition()); 
      } 
     }, 0, 1000); 

     scrubber.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
       mplayer.seekTo(progress); 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 

    } } 

答えて

0

まず最初にまず、int save, boolean flag

変更あなたのsetOnSeekBarChangeListenerこの

volumeControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      save = progress; 

     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
      mplayer.pause(); 
      flag = true; 


     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
      mplayer.seekTo(save); 
      mplayer.start(); 
     } 
    }); 

に公共int型や公共ブール値を定義し、あなたのTimer().scheduleAtFixedRateを変更します。ここでは

は私のコードですこれにif文を追加しました

new Timer().scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 

      if (!flag) 
       scrubber.setProgress(mplayer.getCurrentPosition()); 

     } 
    },0 ,1000); 

および完了! 変更の理由を理解したいと考えています。しかし、もしあなたがただ尋ねなかったら。