【问题标题】:seekbar not working with video view when handle and move it处理和移动时搜索栏不适用于视频视图
【发布时间】:2021-11-02 21:30:25
【问题描述】:

我正在构建一个简单的视频播放器 Ui,我有一个:seekbartwo buttons 来控制video view,当我点击seekbar 的任何一点时,一切都很好,video view 进度将与seekbar 相同,buttons 也在工作!但是,当我处理seekbar 拇指并移动它,然后离开它时,一切都搞砸了,seekbarbuttons 将永远不会再工作,所以我没有得到Exception error 它只是不会再次工作。为什么会这样?

活动

公共类播放器扩展 AppCompatActivity {

View controller;
Handler handler;
SeekBar seekBar;
VideoView videoView;
ImageButton play_btn, pause_btn;
ImageButton forward_btn, replay_btn;

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

    handler = new Handler();

    videoView = (VideoView) findViewById(R.id.videoView);

    controller = findViewById(R.id.player_controller); // the controller View
    hideController(controller);

    forward_btn = (ImageButton) findViewById(R.id.playerController_forward_10_Button);
    replay_btn = (ImageButton) findViewById(R.id.playerController_replay_10_Button);

    forward_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            forward_10_sec();
        }
    });
    replay_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            reply_10_sec();
        }
    });

    play_btn = (ImageButton) findViewById(R.id.playerController_playButton);
    pause_btn = (ImageButton) findViewById(R.id.playerController_pauseButton);

    play_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            play();
        }
    });
    pause_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            pause();
        }
    });

    seekBar = findViewById(R.id.playerController_seekBar); // video seekBar
    seekBar.setOnSeekBarChangeListener(onSeekBarChangeListener);

    videoView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (controller.getVisibility() == View.INVISIBLE)
                showController(controller);
            else
                hideController(controller);
        }
    });

    Intent intent = getIntent();
    if (intent != null)
        setVideoSource(intent);
}

private void play() {
    if(!videoView.isPlaying()) {
        videoView.start();
        play_btn.setVisibility(View.INVISIBLE);
        pause_btn.setVisibility(View.VISIBLE);
    }
}

private void pause() {
    if(videoView.isPlaying()) {
        videoView.pause();
        pause_btn.setVisibility(View.INVISIBLE);
        play_btn.setVisibility(View.VISIBLE);
    }
}

private void forward_10_sec() {
    if (videoView.canSeekForward())
        videoView.seekTo(videoView.getCurrentPosition() + 1000);
}

private void reply_10_sec() {
    if (videoView.canSeekBackward())
        videoView.seekTo(videoView.getCurrentPosition() - 1000);
}

// to show the controllers
private void showController(View controller) {
    controller.setVisibility(View.VISIBLE);

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            hideController(controller);
        }
    }, 6000);
}

// to hide the controllers
private void hideController(View controller) {
    controller.setVisibility(View.INVISIBLE);
}

// to set video source from the main app or file manager
private void setVideoSource(Intent intent) {
    ... some codes to set path ...

    play();
    showController(controller);
    updateSeekBarProgress();
}

// to move seekBar to real video progress
private void updateSeekBarProgress() {
    Player.this.runOnUiThread(updateSeekBar);
}

private Runnable updateSeekBar = new Runnable() {
    @Override
    public void run() {
        seekBar.setMax(videoView.getDuration() / 1000);
        seekBar.setProgress(videoView.getCurrentPosition() / 1000);
        seekBar.postDelayed(this,500);
    }
};

SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
        if (b) {
            videoView.seekTo(i*1000);
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
};

}

activity_player

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".Player">

<VideoView
    android:id="@+id/videoView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<include
    android:id="@+id/player_controller"
    layout="@layout/player_controller" />

</androidx.constraintlayout.widget.ConstraintLayout>

player_controller

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent_black">

<ImageButton
    android:id="@+id/playerController_playButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:src="@drawable/play_icon_48"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<ImageButton
    android:id="@+id/playerController_pauseButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:src="@drawable/pause_icon_48"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<ImageButton
    android:id="@+id/playerController_replay_10_Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:src="@drawable/replay_10_icon_48"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toStartOf="@id/playerController_playButton"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<ImageButton
    android:id="@+id/playerController_forward_10_Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:src="@drawable/forward_10_icon_48"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@id/playerController_playButton"
    app:layout_constraintTop_toTopOf="parent" />

<SeekBar
    android:id="@+id/playerController_seekBar"
    android:layout_width="0dp"
    android:layout_height="50dp"
    android:layout_marginStart="5dp"
    android:layout_marginEnd="5dp"
    android:progressBackgroundTint="@color/white"
    android:progressTint="@color/white"
    android:secondaryProgressTint="@color/light_purple"
    android:thumbTint="@color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/playerController_playButton" />

</androidx.constraintlayout.widget.ConstraintLayout>

所以,以一种简单的方式:我想以任何移动搜索栏的方式设置video view 进度,如seekbar 进度。

(现在它只是在点击它时起作用,当它处理和移动它时,它就不再起作用了)。

谢谢...

【问题讨论】:

    标签: java android android-layout android-videoview android-seekbar


    【解决方案1】:

    终于搞定了:

    SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            if (b) {
                videoView.seekTo(i * 1000);
            }
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            handler.removeCallbacks(updateSeekBar);
            pause();
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            videoView.seekTo(seekBar.getProgress()*1000);
            play();
            updateSeekBarProgress();
        }
        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多