Skip to content

Commit 6488be0

Browse files
authored
Merge pull request #246 from Henry-ZHR/master
优化PlayerActivity音量滑动条
2 parents d310efe + c7fbb33 commit 6488be0

File tree

2 files changed

+63
-59
lines changed

2 files changed

+63
-59
lines changed

app/src/main/java/remix/myplayer/ui/activity/PlayerActivity.kt

+62-58
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import android.graphics.drawable.GradientDrawable
1414
import android.graphics.drawable.InsetDrawable
1515
import android.graphics.drawable.LayerDrawable
1616
import android.media.AudioManager
17+
import android.media.AudioManager.STREAM_MUSIC
1718
import android.net.Uri
1819
import android.os.Build
1920
import android.os.Bundle
@@ -25,16 +26,16 @@ import android.view.animation.Animation.AnimationListener
2526
import android.widget.ImageView
2627
import android.widget.LinearLayout
2728
import android.widget.SeekBar
29+
import androidx.annotation.RequiresApi
2830
import androidx.appcompat.widget.PopupMenu
2931
import androidx.fragment.app.FragmentManager
3032
import androidx.palette.graphics.Palette
3133
import androidx.palette.graphics.Palette.Swatch
3234
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
33-
import io.reactivex.Completable
3435
import io.reactivex.Single
3536
import io.reactivex.android.schedulers.AndroidSchedulers
36-
import io.reactivex.functions.BiFunction
3737
import io.reactivex.schedulers.Schedulers
38+
import kotlinx.coroutines.launch
3839
import remix.myplayer.App
3940
import remix.myplayer.R
4041
import remix.myplayer.bean.mp3.Song
@@ -348,40 +349,29 @@ class PlayerActivity : BaseMusicActivity() {
348349
}
349350
}
350351

351-
@SuppressLint("CheckResult")
352352
private val onVolumeClick = View.OnClickListener { v ->
353353
when (v.id) {
354-
R.id.volume_down -> Completable
355-
.fromAction {
356-
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
357-
AudioManager.ADJUST_LOWER,
358-
AudioManager.FLAG_PLAY_SOUND)
359-
}
360-
.subscribeOn(Schedulers.io())
361-
.subscribe()
362-
R.id.volume_up -> Completable
363-
.fromAction {
364-
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
365-
AudioManager.ADJUST_RAISE,
366-
AudioManager.FLAG_PLAY_SOUND)
367-
}
368-
.subscribeOn(Schedulers.io())
369-
.subscribe()
354+
R.id.volume_down, R.id.volume_up -> {
355+
launch {
356+
audioManager.adjustStreamVolume(
357+
STREAM_MUSIC,
358+
when (v.id) {
359+
R.id.volume_down -> AudioManager.ADJUST_LOWER
360+
R.id.volume_up -> AudioManager.ADJUST_RAISE
361+
else -> AudioManager.ADJUST_SAME
362+
},
363+
AudioManager.FLAG_PLAY_SOUND
364+
)
365+
updateVolumeSeekbar()
366+
}
367+
}
370368
R.id.next_song -> if (bottomConfig == BOTTOM_SHOW_BOTH) {
371369
makeAndStartAnimation(binding.layoutPlayerVolume.nextSong, false)
372370
makeAndStartAnimation(binding.layoutPlayerVolume.volumeContainer, true)
373371
handler.removeCallbacks(volumeRunnable)
374-
handler.postDelayed(volumeRunnable, DELAY_SHOW_NEXT_SONG.toLong())
372+
handler.postDelayed(volumeRunnable, DELAY_SHOW_NEXT_SONG)
375373
}
376374
}
377-
if (v.id != R.id.next_song) {
378-
Single.zip(Single.fromCallable { audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) },
379-
Single.fromCallable { audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) },
380-
BiFunction { max: Int, current: Int -> longArrayOf(max.toLong(), current.toLong()) })
381-
.subscribeOn(Schedulers.io())
382-
.observeOn(AndroidSchedulers.mainThread())
383-
.subscribe { longs: LongArray -> binding.layoutPlayerVolume.volumeSeekbar.progress = (longs[1] * 1.0 / longs[0] * 100).toInt() }
384-
}
385375
}
386376

387377
private fun makeAndStartAnimation(view: View, show: Boolean) {
@@ -474,35 +464,44 @@ class PlayerActivity : BaseMusicActivity() {
474464
}
475465
})
476466

477-
//音量的Seekbar
478-
Single.zip(Single.fromCallable { audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) },
479-
Single.fromCallable { audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) },
480-
BiFunction { max: Int, current: Int -> intArrayOf(max, current) })
481-
.subscribeOn(Schedulers.io())
482-
.observeOn(AndroidSchedulers.mainThread())
483-
.subscribe { ints: IntArray ->
484-
val current = ints[1]
485-
val max = ints[0]
486-
binding.layoutPlayerVolume.volumeSeekbar.progress = (current * 1.0 / max * 100).toInt()
487-
binding.layoutPlayerVolume.volumeSeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
488-
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
489-
if (bottomConfig == BOTTOM_SHOW_BOTH) {
490-
handler.removeCallbacks(volumeRunnable)
491-
handler.postDelayed(volumeRunnable, DELAY_SHOW_NEXT_SONG.toLong())
492-
}
493-
if (fromUser) {
494-
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
495-
(seekBar.progress / 100f * max).toInt(),
496-
AudioManager.FLAG_PLAY_SOUND)
497-
}
467+
launch {
468+
val volumeSeekbar = binding.layoutPlayerVolume.volumeSeekbar
469+
val min = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
470+
audioManager.getStreamMinVolume(STREAM_MUSIC)
471+
} else 0
472+
val max = audioManager.getStreamMaxVolume(STREAM_MUSIC)
473+
val current = audioManager.getStreamVolume(STREAM_MUSIC)
474+
475+
runOnUiThread {
476+
if (min != 0) {
477+
@RequiresApi(Build.VERSION_CODES.O)
478+
volumeSeekbar.min = min
479+
}
480+
volumeSeekbar.max = max
481+
volumeSeekbar.progress = current
482+
483+
volumeSeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
484+
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
485+
if (bottomConfig == BOTTOM_SHOW_BOTH) {
486+
handler.removeCallbacks(volumeRunnable)
487+
handler.postDelayed(volumeRunnable, DELAY_SHOW_NEXT_SONG)
488+
}
489+
if (fromUser) {
490+
audioManager.setStreamVolume(
491+
STREAM_MUSIC,
492+
progress,
493+
AudioManager.FLAG_PLAY_SOUND
494+
)
498495
}
496+
}
499497

500-
override fun onStartTrackingTouch(seekBar: SeekBar) {}
501-
override fun onStopTrackingTouch(seekBar: SeekBar) {}
502-
})
503-
}
498+
override fun onStartTrackingTouch(seekBar: SeekBar) {}
499+
override fun onStopTrackingTouch(seekBar: SeekBar) {}
500+
})
501+
}
502+
}
504503
if (bottomConfig == BOTTOM_SHOW_BOTH) {
505-
handler.postDelayed(volumeRunnable, DELAY_SHOW_NEXT_SONG.toLong())
504+
handler.postDelayed(volumeRunnable, DELAY_SHOW_NEXT_SONG)
506505
}
507506
}
508507

@@ -733,9 +732,7 @@ class PlayerActivity : BaseMusicActivity() {
733732
try {
734733
//音量
735734
if (binding.layoutPlayerVolume.volumeSeekbar.visibility == View.VISIBLE) {
736-
val max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
737-
val current = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
738-
runOnUiThread { binding.layoutPlayerVolume.volumeSeekbar.progress = (current * 1.0 / max * 100).toInt() }
735+
updateVolumeSeekbar()
739736
}
740737
if (!isPlaying()) {
741738
sleep(500)
@@ -997,6 +994,13 @@ class PlayerActivity : BaseMusicActivity() {
997994
binding.seekbar.progress = currentTime
998995
}
999996

997+
private fun updateVolumeSeekbar() {
998+
val volume = audioManager.getStreamVolume(STREAM_MUSIC)
999+
runOnUiThread {
1000+
binding.layoutPlayerVolume.volumeSeekbar.progress = volume
1001+
}
1002+
}
1003+
10001004
@OnHandleMessage
10011005
fun handleInternal(msg: Message) {
10021006
// if(msg.what == UPDATE_BG){
@@ -1044,7 +1048,7 @@ class PlayerActivity : BaseMusicActivity() {
10441048
const val BACKGROUND_CUSTOM_IMAGE = 2
10451049

10461050
private const val FRAGMENT_COUNT = 2
1047-
private const val DELAY_SHOW_NEXT_SONG = 3000
1051+
private const val DELAY_SHOW_NEXT_SONG: Long = 3000
10481052

10491053
const val ACTION_UPDATE_NEXT = "remix.myplayer.update.next_song"
10501054

gradle/libs.versions.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[versions]
2-
agp = "8.3.1"
2+
agp = "8.3.2"
33
kotlin = "1.9.23"
44
ksp = "1.9.23-1.0.19"
55

0 commit comments

Comments
 (0)