1. 程式人生 > >Media Player 音樂播放器的學習3 新增SeekBar

Media Player 音樂播放器的學習3 新增SeekBar

新增SeekBar

一、佈局

<SeekBar
        android:id="@+id/sb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

二、在服務裡新增方法:

MusicService . java

private void addSeekBar() {


        //使用計時器,去不斷的獲取進度的程式碼
        Timer timer = new Timer();
        //設定計時器
        timer.schedule(new
TimerTask() { @Override public void run() { int duration = player.getDuration(); int currentPosition = player.getCurrentPosition(); Message msg = MainActivity.handler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putInt("duration"
, duration); bundle.putInt("currentPosition", currentPosition); msg.setData(bundle); MainActivity.handler.sendMessage(msg); } }, 5, 500); }

通過getDuration()方法可以獲得時長,通過getCurrentPosition()可以獲得當前播放位置。
這裡需要用handler,並且使用了Bundle傳遞,注意是在MainActivity.java中定義的Handler。
最後,讓它每隔500毫秒更新一次進度,使用了Timer 計時器。

  public static Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle bundle = msg.getData();
            int duration = bundle.getInt("duration");
            int currentPosition = bundle.getInt("currentPosition");

            sb.setMax(duration);
            sb.setProgress(currentPosition);
        }
    };

給SeekBar設定滑動監聽:

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

        sb = (SeekBar) findViewById(R.id.sb);
        sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            //拖動呼叫
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            //當手指按下進度條,開始呼叫
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            //離開呼叫
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                int progress = seekBar.getProgress();
                mi.seekTo(progress);
            }
        });
}

因為是通過服務這個中間者來傳遞資料的所以需要在服務裡新增seekTo()方法:

 private void seekTo(int progress) {
        player.seekTo(progress);
    }

在介面中新增抽象方法:

public interface MusicInterface {
    void play();

    void pause();

    void stop();

    void continuePlay();

    void seekTo(int progress);
}