Add new BackdropDrawers, update glass playground to support parameter adjustment

This commit is contained in:
Kyant0 committed 2025-09-22 23:21:27 +08:00
1 parent 98094adf9b
commit 5abcb17389
11 files changed
+172 -16

No files matched your search

Binary file not shown.
@@ -7,6 +7,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding
@@ -38,7 +39,7 @@ import com.kyant.backdrop.rememberBackdrop
fun BackdropDemoScaffold(
modifier: Modifier = Modifier,
@DrawableRes initialPainterResId: Int = R.drawable.wallpaper_light,
content: @Composable (backdrop: Backdrop) -> Unit
content: @Composable BoxScope.(backdrop: Backdrop) -> Unit
) {
Box(
Modifier.fillMaxSize(),
@@ -33,7 +33,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastCoerceAtMost
import androidx.compose.ui.util.fastCoerceIn
import androidx.compose.ui.util.lerp
import com.kyant.backdrop.Backdrop
import com.kyant.backdrop.BackdropDrawer
import com.kyant.backdrop.catalog.utils.inspectDragGestures
import com.kyant.backdrop.drawBackdrop
import com.kyant.backdrop.effects.blur
@@ -50,7 +50,7 @@ import kotlin.math.tanh
@Composable
fun LiquidButton(
onClick: () -> Unit,
backdrop: Backdrop,
backdrop: BackdropDrawer,
modifier: Modifier = Modifier,
isInteractive: Boolean = true,
tint: Color = Color.Unspecified,
@@ -11,7 +11,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
@@ -37,7 +36,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastCoerceIn
import androidx.compose.ui.util.fastRoundToInt
import androidx.compose.ui.util.lerp
import com.kyant.backdrop.Backdrop
import com.kyant.backdrop.BackdropDrawer
import com.kyant.backdrop.backdrop
import com.kyant.backdrop.drawBackdrop
import com.kyant.backdrop.effects.refractionWithDispersion
@@ -53,7 +52,7 @@ fun LiquidSlider(
value: () -> Float,
onValueChange: (Float) -> Unit,
valueRange: ClosedFloatingPointRange<Float>,
backdrop: Backdrop,
backdrop: BackdropDrawer,
modifier: Modifier = Modifier
) {
val isLightTheme = !isSystemInDarkTheme()
@@ -82,9 +81,7 @@ fun LiquidSlider(
}
BoxWithConstraints(
modifier
.padding(horizontal = 16f.dp)
.fillMaxWidth(),
modifier.fillMaxWidth(),
contentAlignment = Alignment.CenterStart
) {
val density = LocalDensity.current
@@ -4,11 +4,22 @@ import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.VectorConverter
import androidx.compose.foundation.gestures.detectTransformGestures
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.text.BasicText
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.paint
import androidx.compose.ui.geometry.Offset
@@ -17,11 +28,19 @@ import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.kyant.backdrop.EmptyBackdropDrawer
import com.kyant.backdrop.catalog.BackdropDemoScaffold
import com.kyant.backdrop.catalog.Block
import com.kyant.backdrop.catalog.R
import com.kyant.backdrop.catalog.components.LiquidButton
import com.kyant.backdrop.catalog.components.LiquidSlider
import com.kyant.backdrop.drawBackdrop
import com.kyant.backdrop.effects.blur
import com.kyant.backdrop.effects.refraction
import com.kyant.backdrop.effects.refractionWithDispersion
import com.kyant.backdrop.effects.saturation
import com.kyant.capsule.ContinuousRoundedRectangle
import kotlinx.coroutines.launch
@@ -41,9 +60,18 @@ fun GlassPlaygroundContent() {
val zoomAnimation = remember { Animatable(1f) }
val rotationAnimation = remember { Animatable(0f) }
var isSheetExpanded by remember { mutableStateOf(true) }
var blurRadiusDp by remember { mutableFloatStateOf(0f) }
var refractionHeightFrac by remember { mutableFloatStateOf(0.1f) }
var refractionAmountFrac by remember { mutableFloatStateOf(0.2f) }
var dispersionIntensity by remember { mutableFloatStateOf(0f) }
BackdropDemoScaffold { backdrop ->
Box(
Modifier
.padding(top = 48f.dp)
.statusBarsPadding()
.drawBackdrop(
backdrop,
{ ContinuousRoundedRectangle(48f.dp) },
@@ -59,8 +87,15 @@ fun GlassPlaygroundContent() {
transformOrigin = TransformOrigin(0.5f, 0.5f)
}
) {
val minDimension = size.minDimension
saturation()
refraction(24f.dp.toPx(), size.minDimension / 2f, true)
blur(blurRadiusDp.dp.toPx())
refractionWithDispersion(
height = refractionHeightFrac * minDimension,
amount = refractionAmountFrac * minDimension,
hasDepthEffect = true,
dispersionIntensity = dispersionIntensity
)
}
.pointerInput(animationScope) {
fun Offset.rotateBy(angle: Float): Offset {
@@ -91,6 +126,86 @@ fun GlassPlaygroundContent() {
colorFilter = ColorFilter.tint(accentColor)
)
.size(256f.dp)
.align(Alignment.TopCenter)
)
Block {
if (isSheetExpanded) {
val sheetBackdrop = EmptyBackdropDrawer
Column(
Modifier
.padding(16f.dp)
.padding(bottom = 72f.dp)
.navigationBarsPadding()
.drawBackdrop(
backdrop,
{ ContinuousRoundedRectangle(32f.dp) },
onDrawSurface = { drawRect(Color.White.copy(alpha = 0.5f)) }
) {
saturation()
blur(4f.dp.toPx())
refraction(16f.dp.toPx(), 32f.dp.toPx())
}
.padding(24f.dp)
.align(Alignment.BottomCenter),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(16f.dp)
) {
Column(verticalArrangement = Arrangement.spacedBy(8f.dp)) {
BasicText("Blur radius")
LiquidSlider(
value = { blurRadiusDp },
onValueChange = { blurRadiusDp = it },
valueRange = 0f..32f,
backdrop = sheetBackdrop
)
}
Column(verticalArrangement = Arrangement.spacedBy(8f.dp)) {
BasicText("Refraction height")
LiquidSlider(
value = { refractionHeightFrac },
onValueChange = { refractionHeightFrac = it },
valueRange = 0f..0.5f,
backdrop = sheetBackdrop
)
}
Column(verticalArrangement = Arrangement.spacedBy(8f.dp)) {
BasicText("Refraction amount")
LiquidSlider(
value = { refractionAmountFrac },
onValueChange = { refractionAmountFrac = it },
valueRange = 0f..1f,
backdrop = sheetBackdrop
)
}
Column(verticalArrangement = Arrangement.spacedBy(8f.dp)) {
BasicText("Dispersion intensity")
LiquidSlider(
value = { dispersionIntensity },
onValueChange = { dispersionIntensity = it },
valueRange = 0f..1f,
backdrop = sheetBackdrop
)
}
}
}
}
Block {
LiquidButton(
{ isSheetExpanded = !isSheetExpanded },
backdrop,
Modifier
.padding(20f.dp)
.navigationBarsPadding()
.align(Alignment.BottomStart),
tint = Color(0xFFFF8D28)
) {
BasicText(
if (isSheetExpanded) "🔽" else "⬆️",
style = TextStyle(Color.White, 15f.sp)
)
}
}
}
}
@@ -27,7 +27,7 @@ fun SliderContent() {
onValueChange = { value = it },
valueRange = 0f..100f,
backdrop = backdrop,
Modifier.padding(horizontal = 16f.dp)
Modifier.padding(horizontal = 32f.dp)
)
}
}