2

進行状況スライダーへのタッチ イベントをキャッチして、指がスライダーから離されるまでMediaController更新がMediaPlayer発生しないようにする必要があります。

[おそらく、私の状況は特殊です。私は、「プログラム」ごとに複数の「スタック」に入っているストリーミング ビデオを再生しています。次のスタックは、前のスタックが完了するまでロードされません。スライダーはすべてのスタックの期間を表す必要があり、「親指」の進行状況は合計期間を表す必要があります。getBufferPercentage()これは、 、getCurrentPosition()、および]getDuration()のメソッドをオーバーライドすることで簡単に実行できます。MediaPlayerControl

さらに問題なのは、タイムラインに沿って前後に「スクラブ」(親指を動かす) ことです。データ ソースがfor everysetの動きとともに複数回発生する場合seekTo、物事はすぐに行き詰まり、クラッシュします。ユーザーがスクラブを完了するまで、MediaPlayer が何のアクションも実行しない方がよいでしょう。

他の人が書いたように、はい、MediaController の独自の実装を作成するのが最善です。しかし、なぜそのすべての作業をやり直すのでしょうか? MediaController を拡張しようとしましたが、すぐに複雑になりました。スライダーへのタッチイベントをキャッチしたかっただけです!

4

1 に答える 1

15

MediaController の要素へのハンドルを取得できます。

final int topContainerId1 = getResources().getIdentifier("mediacontroller_progress", "id", "android");
final SeekBar seekbar = (SeekBar) mController.findViewById(topContainerId1);

次に、シークバーにリスナーを設定します。これには、3 つのパブリック メソッドを実装する必要があります。

seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        // Log.i("TAG", "#### onProgressChanged: " + progress);
        // update current position here
        }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // Log.i("TAG", "#### onStartTrackingTouch");
        // this tells the controller to stay visible while user scrubs
        mController.show(3600000);
        // if it is possible, pause the video
        if (playerState == MPState.Started || playerState == MPState.Paused) {
            mediaPlayer.pause();
            playerState = MPState.Paused;
        }
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        int seekValue = seekBar.getProgress();
        int newMinutes = Math.round((float)getTotalDuration() * (float)seekValue / (float)seekBar.getMax());
        // Log.i("TAG", "#### onStopTrackingTouch: " + newMinutes);
        mController.show(3000); // = sDefaultTimeout, hide in 3 seconds
    }
});

警告: これは、スクラブ中に現在の位置、左側の TextView 時間値を更新していません。(このマージンが小さすぎて含めることができない、本当に驚くべき方法がありました)。

于 2012-07-19T19:42:31.167 に答える