diff --git a/app/release/app-release.apk b/app/release/app-release.apk index d2c901e..be0cd1e 100644 Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ diff --git a/app/release/baselineProfiles/0/app-release.dm b/app/release/baselineProfiles/0/app-release.dm index 7af88a1..f231994 100644 Binary files a/app/release/baselineProfiles/0/app-release.dm and b/app/release/baselineProfiles/0/app-release.dm differ diff --git a/app/release/baselineProfiles/1/app-release.dm b/app/release/baselineProfiles/1/app-release.dm index 88169b7..6f82823 100644 Binary files a/app/release/baselineProfiles/1/app-release.dm and b/app/release/baselineProfiles/1/app-release.dm differ diff --git a/app/src/main/java/com/kyant/glass/playground/ConfigurationBottomSheet.kt b/app/src/main/java/com/kyant/glass/playground/ConfigurationBottomSheet.kt index fa46b83..a354405 100644 --- a/app/src/main/java/com/kyant/glass/playground/ConfigurationBottomSheet.kt +++ b/app/src/main/java/com/kyant/glass/playground/ConfigurationBottomSheet.kt @@ -167,13 +167,19 @@ fun ConfigurationBottomSheet( providerState, Modifier.fillMaxWidth() ) - SliderChip( - state.dispersionHeight, - stringResource(R.string.dispersion_height), - { Icon(painterResource(R.drawable.star_shine_24px)) }, - providerState, - Modifier.fillMaxWidth() - ) + Button( + { state.isDispersionEnabled = !state.isDispersionEnabled }, + Modifier.liquidGlass(providerState, GlassStyle(CornerShape.full)), + colors = ButtonColors.filled( + containerColor = primary.copy(alpha = 0.85f) + ) + ) { + Text( + if (state.isDispersionEnabled) stringResource(R.string.disable_dispersion) + else stringResource(R.string.enable_dispersion), + Modifier.animateContentSize(MotionScheme.fastSpatial()) + ) + } } null -> {} diff --git a/app/src/main/java/com/kyant/glass/playground/Preview.kt b/app/src/main/java/com/kyant/glass/playground/Preview.kt index ea85aa1..a2f8c44 100644 --- a/app/src/main/java/com/kyant/glass/playground/Preview.kt +++ b/app/src/main/java/com/kyant/glass/playground/Preview.kt @@ -153,6 +153,7 @@ fun Preview() { shape = RoundedRectangle(state.cornerRadius.value) } .graphicsLayer { // dispersion effect + if (!state.isDispersionEnabled) return@graphicsLayer renderEffect = RenderEffect.createRuntimeShaderEffect( RuntimeShader( """ @@ -160,7 +161,9 @@ fun Preview() { uniform float2 size; uniform float cornerRadius; + uniform float dispersionHeight; + uniform float dispersionAmount; float lerp(float a, float b, float t) { return a + (b - a) * t; @@ -206,20 +209,19 @@ fun Preview() { float2 normal = gradSdRoundedRectangle(centeredCoord, halfSize, cornerRadius); float2 tangent = normalToTangent(normal); - float dispersionFraction = 1.0 - -sd / dispersionHeight; - float dispersionWidth = dispersionHeight * circleMap(dispersionFraction); - if (dispersionWidth < 2.0) { + float dispersionDistance = circleMap(1.0 - -sd / dispersionHeight) * dispersionAmount; + if (dispersionDistance < 2.0) { half4 color = image.eval(coord); return color; } half4 dispersedColor = half4(0.0); half4 weight = half4(0.0); - float maxI = min(dispersionWidth, 20.0); + float maxI = min(dispersionDistance, 20.0); for (float i = 0.0; i < 20.0; i++) { float t = i / maxI; if (t > 1.0) break; - half4 color = image.eval(coord + tangent * float2(t - 0.5) * dispersionWidth); + half4 color = image.eval(coord + tangent * float2(t - 0.5) * dispersionDistance); half rMask = step(0.5, t); half gMask = step(0.25, t) * step(t, 0.75); half bMask = step(t, 0.5); @@ -242,7 +244,9 @@ fun Preview() { setFloatUniform("size", size.width, size.height) setFloatUniform("cornerRadius", cornerRadius) + setFloatUniform("dispersionHeight", state.refractionHeight.value.toPx()) + setFloatUniform("dispersionAmount", -state.refractionAmount.value.toPx()) }, "image" ).asComposeRenderEffect() diff --git a/app/src/main/java/com/kyant/glass/playground/PreviewState.kt b/app/src/main/java/com/kyant/glass/playground/PreviewState.kt index e088daa..1ff3b4e 100644 --- a/app/src/main/java/com/kyant/glass/playground/PreviewState.kt +++ b/app/src/main/java/com/kyant/glass/playground/PreviewState.kt @@ -107,13 +107,7 @@ class PreviewState { typeConverter = Float.VectorConverter, valueLabel = { "%.2f".format(it) } ) - val dispersionHeight: LiquidGlassParamValue = - LiquidGlassParamValue( - initialValue = 0.dp, - valueRange = { 0.dp..cornerRadius.value }, - typeConverter = Dp.VectorConverter, - valueLabel = { "${it.value.fastRoundToInt()} dp" } - ) + var isDispersionEnabled: Boolean by mutableStateOf(false) val bleedAmount: LiquidGlassParamValue = LiquidGlassParamValue( @@ -181,7 +175,7 @@ class PreviewState { launch { refractionHeight.reset() } launch { refractionAmount.reset() } launch { eccentricFactor.reset() } - launch { dispersionHeight.reset() } + isDispersionEnabled = false launch { bleedAmount.reset() } launch { bleedBlurRadius.reset() } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 07c08e3..44ca5bf 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -12,9 +12,11 @@ 颜色 对比度 圆角半径 + 禁用色散 禁用不安全值 色散高度 离心系数 + 启用色散 启用不安全值 高度 隐藏控件 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0eec73f..8930b19 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,9 +12,11 @@ Colors Contrast Corner radius + Disable dispersion Disable unsafe values Dispersion height Eccentric factor + Enable dispersion Enable unsafe values Height Hide controls