make only one of the volume indicators vissible
This commit is contained in:
parent
1fde8569ce
commit
601dbf2e7f
|
@ -29,8 +29,8 @@ private const val TAG = "TouchUi"
|
|||
|
||||
|
||||
const val DELAY_UNTIL_SHOWING_UI_AFTER_TOUCH_IN_MS: Long = 200
|
||||
const val SEEK_ANIMATION_DURATION_IN_MS = 400
|
||||
const val FAST_SEEKMODE_DURATION = 500L
|
||||
const val SEEK_ANIMATION_DURATION_IN_MS = 300
|
||||
const val FAST_SEEK_MODE_DURATION = 500L
|
||||
const val SEEK_ANIMATION_FADE_IN = 200
|
||||
const val SEEK_ANIMATION_FADE_OUT = 500
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ import androidx.compose.ui.Modifier
|
|||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
|
||||
import net.newpipe.newplayer.ui.videoplayer.FAST_SEEKMODE_DURATION
|
||||
import net.newpipe.newplayer.ui.videoplayer.FAST_SEEK_MODE_DURATION
|
||||
|
||||
private const val TAG = "EmbeddedGestureUI"
|
||||
|
||||
|
@ -68,10 +68,10 @@ fun EmbeddedGestureUI(
|
|||
}
|
||||
|
||||
Row(modifier = modifier) {
|
||||
TouchSurface(
|
||||
GestureSurface(
|
||||
modifier = Modifier
|
||||
.weight(1f),
|
||||
multitapDurationInMs = FAST_SEEKMODE_DURATION,
|
||||
multiTapTimeoutInMs = FAST_SEEK_MODE_DURATION,
|
||||
onRegularTap = defaultOnRegularTap,
|
||||
onMultiTap = {
|
||||
fastSeek(-it)
|
||||
|
@ -92,10 +92,10 @@ fun EmbeddedGestureUI(
|
|||
}
|
||||
}
|
||||
}
|
||||
TouchSurface(
|
||||
GestureSurface(
|
||||
modifier = Modifier
|
||||
.weight(1f),
|
||||
multitapDurationInMs = FAST_SEEKMODE_DURATION,
|
||||
multiTapTimeoutInMs = FAST_SEEK_MODE_DURATION,
|
||||
onRegularTap = defaultOnRegularTap,
|
||||
onMovement = handleDownwardMovement,
|
||||
onMultiTap = fastSeek,
|
||||
|
|
|
@ -41,7 +41,13 @@ import androidx.compose.ui.graphics.Color
|
|||
import androidx.compose.ui.layout.onGloballyPositioned
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
|
||||
import net.newpipe.newplayer.ui.videoplayer.FAST_SEEKMODE_DURATION
|
||||
import net.newpipe.newplayer.ui.videoplayer.FAST_SEEK_MODE_DURATION
|
||||
|
||||
private enum class IndicatorMode {
|
||||
NONE,
|
||||
VOLUME_INDICATOR_VISSIBLE,
|
||||
BRIGHTNESS_INDICATOR_VISSIBLE
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun FullscreenGestureUI(
|
||||
|
@ -58,7 +64,17 @@ fun FullscreenGestureUI(
|
|||
volumeChange: (Float) -> Unit,
|
||||
brightnesChange: (Float) -> Unit
|
||||
) {
|
||||
|
||||
var heightPx by remember {
|
||||
mutableStateOf(0f)
|
||||
}
|
||||
|
||||
var indicatorMode by remember {
|
||||
mutableStateOf(IndicatorMode.NONE)
|
||||
}
|
||||
|
||||
val defaultOnRegularTap = {
|
||||
|
||||
if (uiVissible) {
|
||||
hideUi()
|
||||
} else {
|
||||
|
@ -66,26 +82,14 @@ fun FullscreenGestureUI(
|
|||
}
|
||||
}
|
||||
|
||||
var heightPx by remember {
|
||||
mutableStateOf(0f)
|
||||
}
|
||||
|
||||
var volumeIndicatorVissible by remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
|
||||
var brightnesIndicatorVissible by remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
|
||||
Box(modifier = modifier.onGloballyPositioned { coordinates ->
|
||||
heightPx = coordinates.size.height.toFloat()
|
||||
}) {
|
||||
Row {
|
||||
TouchSurface(
|
||||
GestureSurface(
|
||||
modifier = Modifier
|
||||
.weight(1f),
|
||||
multitapDurationInMs = FAST_SEEKMODE_DURATION,
|
||||
multiTapTimeoutInMs = FAST_SEEK_MODE_DURATION,
|
||||
onRegularTap = defaultOnRegularTap,
|
||||
onMultiTap = {
|
||||
println("multitap ${-it}")
|
||||
|
@ -93,14 +97,19 @@ fun FullscreenGestureUI(
|
|||
},
|
||||
onMultiTapFinished = fastSeekFinished,
|
||||
onUp = {
|
||||
brightnesIndicatorVissible = false
|
||||
indicatorMode = IndicatorMode.NONE
|
||||
},
|
||||
onMovement = {change ->
|
||||
brightnesIndicatorVissible = true
|
||||
onMovement = { change ->
|
||||
if (indicatorMode == IndicatorMode.NONE
|
||||
|| indicatorMode == IndicatorMode.BRIGHTNESS_INDICATOR_VISSIBLE
|
||||
) {
|
||||
indicatorMode = IndicatorMode.BRIGHTNESS_INDICATOR_VISSIBLE
|
||||
|
||||
if (heightPx != 0f) {
|
||||
brightnesChange(-change.y / heightPx)
|
||||
}
|
||||
}
|
||||
}
|
||||
) {
|
||||
FadedAnimationForSeekFeedback(
|
||||
fastSeekSeconds,
|
||||
|
@ -115,33 +124,37 @@ fun FullscreenGestureUI(
|
|||
}
|
||||
}
|
||||
}
|
||||
TouchSurface(
|
||||
GestureSurface(
|
||||
modifier = Modifier
|
||||
.weight(1f),
|
||||
onRegularTap = defaultOnRegularTap,
|
||||
multitapDurationInMs = FAST_SEEKMODE_DURATION,
|
||||
multiTapTimeoutInMs = FAST_SEEK_MODE_DURATION,
|
||||
onMovement = { movement ->
|
||||
if (0 < movement.y) {
|
||||
switchToEmbeddedView()
|
||||
}
|
||||
}
|
||||
)
|
||||
TouchSurface(
|
||||
GestureSurface(
|
||||
modifier = Modifier
|
||||
.weight(1f),
|
||||
onRegularTap = defaultOnRegularTap,
|
||||
multitapDurationInMs = FAST_SEEKMODE_DURATION,
|
||||
multiTapTimeoutInMs = FAST_SEEK_MODE_DURATION,
|
||||
onMultiTap = fastSeek,
|
||||
onMultiTapFinished = fastSeekFinished,
|
||||
onUp = {
|
||||
volumeIndicatorVissible = false
|
||||
indicatorMode = IndicatorMode.NONE
|
||||
},
|
||||
onMovement = { change ->
|
||||
volumeIndicatorVissible = true
|
||||
if (indicatorMode == IndicatorMode.NONE
|
||||
|| indicatorMode == IndicatorMode.VOLUME_INDICATOR_VISSIBLE
|
||||
) {
|
||||
indicatorMode = IndicatorMode.VOLUME_INDICATOR_VISSIBLE
|
||||
if (heightPx != 0f) {
|
||||
volumeChange(-change.y / heightPx)
|
||||
}
|
||||
}
|
||||
}
|
||||
) {
|
||||
FadedAnimationForSeekFeedback(fastSeekSeconds) { fastSeekSecondsToDisplay ->
|
||||
Box(modifier = Modifier.fillMaxSize()) {
|
||||
|
@ -154,17 +167,21 @@ fun FullscreenGestureUI(
|
|||
}
|
||||
}
|
||||
}
|
||||
AnimatedVisibility(modifier = Modifier.align(Alignment.Center),
|
||||
visible = volumeIndicatorVissible,
|
||||
AnimatedVisibility(
|
||||
modifier = Modifier.align(Alignment.Center),
|
||||
visible = indicatorMode == IndicatorMode.VOLUME_INDICATOR_VISSIBLE,
|
||||
enter = scaleIn(initialScale = 0.95f, animationSpec = tween(100)),
|
||||
exit = scaleOut(targetScale = 0.95f, animationSpec = tween(100))) {
|
||||
exit = scaleOut(targetScale = 0.95f, animationSpec = tween(100))
|
||||
) {
|
||||
VolumeCircle(volumeFraction = volume)
|
||||
}
|
||||
|
||||
AnimatedVisibility(modifier = Modifier.align(Alignment.Center),
|
||||
visible = brightnesIndicatorVissible,
|
||||
AnimatedVisibility(
|
||||
modifier = Modifier.align(Alignment.Center),
|
||||
visible = indicatorMode == IndicatorMode.BRIGHTNESS_INDICATOR_VISSIBLE,
|
||||
enter = scaleIn(initialScale = 0.95f, animationSpec = tween(100)),
|
||||
exit = scaleOut(targetScale = 0.95f, animationSpec = tween(100))) {
|
||||
exit = scaleOut(targetScale = 0.95f, animationSpec = tween(100))
|
||||
) {
|
||||
VolumeCircle(
|
||||
volumeFraction = brightnes,
|
||||
modifier = Modifier.align(Alignment.Center),
|
||||
|
|
|
@ -40,10 +40,10 @@ import kotlinx.coroutines.launch
|
|||
|
||||
@Composable
|
||||
@OptIn(ExperimentalComposeUiApi::class)
|
||||
fun TouchSurface(
|
||||
fun GestureSurface(
|
||||
modifier: Modifier,
|
||||
color: Color = Color.Transparent,
|
||||
multitapDurationInMs: Long,
|
||||
multiTapTimeoutInMs: Long,
|
||||
onMultiTap: (Int) -> Unit = {},
|
||||
onMultiTapFinished: () -> Unit = {},
|
||||
onRegularTap: () -> Unit = {},
|
||||
|
@ -87,19 +87,19 @@ fun TouchSurface(
|
|||
val currentTime = System.currentTimeMillis()
|
||||
if (!moveOccured) {
|
||||
val timeSinceLastTouch = currentTime - lastTouchTime
|
||||
if (timeSinceLastTouch <= multitapDurationInMs) {
|
||||
if (timeSinceLastTouch <= multiTapTimeoutInMs) {
|
||||
regularTabJob?.cancel()
|
||||
cancelMultitapJob?.cancel()
|
||||
multitapAmount++
|
||||
onMultiTap(multitapAmount)
|
||||
cancelMultitapJob = composableScope.launch {
|
||||
delay(multitapDurationInMs)
|
||||
delay(multiTapTimeoutInMs)
|
||||
multitapAmount = 0
|
||||
onMultiTapFinished()
|
||||
}
|
||||
} else {
|
||||
regularTabJob = composableScope.launch {
|
||||
delay(multitapDurationInMs)
|
||||
delay(multiTapTimeoutInMs)
|
||||
onRegularTap()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue