Commit 0596c6ce authored by wanglei's avatar wanglei

...

parent a87f3acf
package com.base.browserwhite.ui.activity.mediabrowser package com.base.browserwhite.ui.activity.mediabrowser
import android.graphics.Color import android.graphics.Color
import android.widget.SeekBar
import android.widget.SeekBar.OnSeekBarChangeListener
import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import com.base.browserwhite.databinding.ActivityMediaVideoDetailBinding import com.base.browserwhite.databinding.ActivityMediaVideoDetailBinding
import com.base.browserwhite.ui.activity.BaseActivity import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.utils.BarUtils import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
class MediaVideoDetailActivity : BaseActivity<ActivityMediaVideoDetailBinding>() { class MediaVideoDetailActivity : BaseActivity<ActivityMediaVideoDetailBinding>() {
private val TAG = "MediaVideoDetailActivity" private val TAG = "MediaVideoDetailActivity"
...@@ -16,6 +26,8 @@ class MediaVideoDetailActivity : BaseActivity<ActivityMediaVideoDetailBinding>() ...@@ -16,6 +26,8 @@ class MediaVideoDetailActivity : BaseActivity<ActivityMediaVideoDetailBinding>()
ActivityMediaVideoDetailBinding.inflate(layoutInflater) ActivityMediaVideoDetailBinding.inflate(layoutInflater)
} }
private lateinit var player: ExoPlayer private lateinit var player: ExoPlayer
private var job: Job? = null
private var playEnd: Boolean = false
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
...@@ -31,17 +43,122 @@ class MediaVideoDetailActivity : BaseActivity<ActivityMediaVideoDetailBinding>() ...@@ -31,17 +43,122 @@ class MediaVideoDetailActivity : BaseActivity<ActivityMediaVideoDetailBinding>()
val mediaItem = MediaItem.fromUri(uri) val mediaItem = MediaItem.fromUri(uri)
player.setMediaItem(mediaItem) player.setMediaItem(mediaItem)
// player.playWhenReady = false
player.addListener(object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
super.onIsPlayingChanged(isPlaying)
binding.ivPlayPause.isSelected = isPlaying
}
override fun onPlaybackStateChanged(playbackState: Int) {
super.onPlaybackStateChanged(playbackState)
LogEx.logDebug(TAG, "playbackState=$playbackState")
//2,3,4
if (playbackState == Player.STATE_READY) {
playEnd = false
if (job == null) {
job = upDatePositionJob()
}
// 获取总时长
binding.root.post {
val duration = player.duration
binding.seekbar.max = duration.toInt()
binding.tvDuration.text = duration.toTimeString()
}
} else if (playbackState == Player.STATE_ENDED) {
playEnd = true
job?.cancel()
job = null
}
}
override fun onPositionDiscontinuity(oldPosition: Player.PositionInfo, newPosition: Player.PositionInfo, reason: Int) {
super.onPositionDiscontinuity(oldPosition, newPosition, reason)
// 播放位置发生不连续变化
}
})
player.prepare() player.prepare()
player.play() player.play()
}
fun upDatePositionJob() = lifecycleScope.launch(Dispatchers.Main) {
while (isActive) {
val currentPosition = player.currentPosition
binding.seekbar.progress = currentPosition.toInt()
binding.tvCurrentPosition.text = currentPosition.toTimeString()
delay(100)
}
}
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback {
finishToMain()
}
binding.ivFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
binding.ivPlayPause.setOnClickListener {
if (player.isPlaying) {
player.pause()
job?.cancel()
job = null
} else {
if (playEnd) {
player.seekTo(0)
} else {
player.play()
if (job == null) {
job = upDatePositionJob()
}
}
}
}
binding.seekbar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) {
player.seekTo(progress.toLong())
}
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
}
})
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
player.pause() player.pause()
job?.cancel()
job = null
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
player.play() if (player.isPlaying && job == null) {
job = upDatePositionJob()
}
}
fun Long.toTimeString(): String {
val seconds = this / 1000
val minutes = seconds / 60
val hours = minutes / 60
val secondsStr = if (seconds % 60 < 10) "0${seconds % 60}" else "${seconds % 60}"
val minutesStr = if (minutes % 60 < 10) "0${minutes % 60}" else "${minutes % 60}"
val hoursStr = if (hours < 10) "0$hours" else hours.toString()
return if (hours > 0) "$hoursStr:$minutesStr:$secondsStr" else "$minutesStr:$secondsStr"
} }
} }
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/bofang" android:state_selected="false" />
<item android:drawable="@mipmap/zanting" android:state_selected="true" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#8C8C8C" />
<corners android:radius="2.5dp" />
<size android:height="5dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/white" />
<size
android:width="13dp"
android:height="13dp" />
</shape>
\ No newline at end of file
...@@ -57,16 +57,51 @@ ...@@ -57,16 +57,51 @@
app:use_controller="false" /> app:use_controller="false" />
<FrameLayout <LinearLayout
android:background="@drawable/bg_1a1a1a_25"
android:layout_width="345dp" android:layout_width="345dp"
android:layout_height="55dp" android:layout_height="55dp"
android:layout_marginBottom="45dp" android:layout_marginBottom="45dp"
android:background="@drawable/bg_1a1a1a_25"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"> app:layout_constraintStart_toStartOf="parent">
</FrameLayout> <ImageView
android:id="@+id/iv_play_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="22dp"
android:src="@drawable/bg_play_pause"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_current_position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="10dp"
android:textColor="@color/white"
tools:text="00:00" />
<SeekBar
android:id="@+id/seekbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:progressDrawable="@drawable/bg_seekbar_progress"
android:thumb="@drawable/bg_seekbar_thumb" />
<TextView
android:id="@+id/tv_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:textColor="@color/white"
tools:text="00:00" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment