mirror of
https://github.com/geode-sdk/android-launcher.git
synced 2026-10-21 16:32:39 +00:00
background tweaks
This commit is contained in:
1 file changed
+55
-21
@@ -16,10 +16,14 @@ import androidx.compose.ui.Modifier
|
|||||||
import androidx.compose.ui.graphics.Brush
|
import androidx.compose.ui.graphics.Brush
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.Path
|
import androidx.compose.ui.graphics.Path
|
||||||
|
import androidx.compose.ui.platform.LocalConfiguration
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.max
|
||||||
|
import androidx.compose.ui.unit.min
|
||||||
import androidx.compose.ui.zIndex
|
import androidx.compose.ui.zIndex
|
||||||
import kotlin.math.ceil
|
import kotlin.math.sin
|
||||||
|
import kotlin.random.Random
|
||||||
|
|
||||||
val BACKGROUND_INITIAL = Color(0xff_4b_31_68)
|
val BACKGROUND_INITIAL = Color(0xff_4b_31_68)
|
||||||
val BACKGROUND_BOTTOM = Color(0xff_19_10_23)
|
val BACKGROUND_BOTTOM = Color(0xff_19_10_23)
|
||||||
@@ -41,46 +45,57 @@ fun WithWave(modifier: Modifier = Modifier, contents: @Composable () -> Unit) {
|
|||||||
) {
|
) {
|
||||||
contents()
|
contents()
|
||||||
|
|
||||||
|
val configuration = LocalConfiguration.current
|
||||||
|
val screenHeight = configuration.screenHeightDp.dp
|
||||||
|
|
||||||
WaveBackground(
|
WaveBackground(
|
||||||
color = WAVE_COLOR_1,
|
color = WAVE_COLOR_1,
|
||||||
period = 500.dp,
|
period = 500.dp,
|
||||||
amplitude = 20.dp,
|
periodMod = 200.dp,
|
||||||
|
amplitude = 30.dp,
|
||||||
|
amplitudeMod = 20.dp,
|
||||||
baseHeight = 170.dp,
|
baseHeight = 170.dp,
|
||||||
animationTimeMs = 5_000,
|
animationTimeMs = 20_000,
|
||||||
modifier = Modifier.fillMaxSize().zIndex(-4.0f)
|
modifier = Modifier.fillMaxSize().zIndex(-4.0f)
|
||||||
)
|
)
|
||||||
|
|
||||||
WaveBackground(
|
WaveBackground(
|
||||||
color = WAVE_COLOR_2,
|
color = WAVE_COLOR_2,
|
||||||
period = 600.dp,
|
period = 600.dp,
|
||||||
|
periodMod = 200.dp,
|
||||||
amplitude = 20.dp,
|
amplitude = 20.dp,
|
||||||
|
amplitudeMod = 20.dp,
|
||||||
baseHeight = 130.dp,
|
baseHeight = 130.dp,
|
||||||
animationTimeMs = 6_000,
|
animationTimeMs = 24_000,
|
||||||
modifier = Modifier.fillMaxSize().zIndex(-3.0f)
|
modifier = Modifier.fillMaxSize().zIndex(-3.0f)
|
||||||
)
|
)
|
||||||
|
|
||||||
WaveBackground(
|
WaveBackground(
|
||||||
color = WAVE_COLOR_3,
|
color = WAVE_COLOR_3,
|
||||||
period = 800.dp,
|
period = 800.dp,
|
||||||
|
periodMod = 200.dp,
|
||||||
amplitude = 20.dp,
|
amplitude = 20.dp,
|
||||||
|
amplitudeMod = 15.dp,
|
||||||
baseHeight = 80.dp,
|
baseHeight = 80.dp,
|
||||||
animationTimeMs = 8_000,
|
animationTimeMs = 27_000,
|
||||||
modifier = Modifier.fillMaxSize().zIndex(-2.0f)
|
modifier = Modifier.fillMaxSize().zIndex(-2.0f)
|
||||||
)
|
)
|
||||||
|
|
||||||
WaveBackground(
|
WaveBackground(
|
||||||
color = WAVE_COLOR_4,
|
color = WAVE_COLOR_4,
|
||||||
period = 1000.dp,
|
period = 900.dp,
|
||||||
amplitude = 20.dp,
|
periodMod = 200.dp,
|
||||||
|
amplitude = 30.dp,
|
||||||
|
amplitudeMod = 20.dp,
|
||||||
baseHeight = 50.dp,
|
baseHeight = 50.dp,
|
||||||
animationTimeMs = 10_000,
|
animationTimeMs = 30_000,
|
||||||
modifier = Modifier.fillMaxSize().zIndex(-1.0f)
|
modifier = Modifier.fillMaxSize().zIndex(-1.0f)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun WaveBackground(color: Color, period: Dp, amplitude: Dp, baseHeight: Dp, animationTimeMs: Int, modifier: Modifier = Modifier) {
|
fun WaveBackground(color: Color, period: Dp, periodMod: Dp, amplitude: Dp, amplitudeMod: Dp, baseHeight: Dp, animationTimeMs: Int, modifier: Modifier = Modifier) {
|
||||||
val infiniteTransition = rememberInfiniteTransition(label = "Wave Animation Container")
|
val infiniteTransition = rememberInfiniteTransition(label = "Wave Animation Container")
|
||||||
val offset by infiniteTransition.animateFloat(
|
val offset by infiniteTransition.animateFloat(
|
||||||
initialValue = 0.0f,
|
initialValue = 0.0f,
|
||||||
@@ -91,37 +106,56 @@ fun WaveBackground(color: Color, period: Dp, amplitude: Dp, baseHeight: Dp, anim
|
|||||||
label = "Wave Animation"
|
label = "Wave Animation"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val seed = remember { Random.Default.nextInt() }
|
||||||
|
|
||||||
val path = remember { Path() }
|
val path = remember { Path() }
|
||||||
|
|
||||||
Canvas(modifier = modifier) {
|
Canvas(modifier = modifier) {
|
||||||
val baseHeightPx = baseHeight.toPx()
|
val baseHeightPx = baseHeight.toPx()
|
||||||
val periodPx = period.toPx()
|
val periodPx = period.toPx()
|
||||||
val amplitudePx = amplitude.toPx()
|
val amplitudePx = amplitude.toPx()
|
||||||
|
val periodModPx = periodMod.toPx()
|
||||||
|
val amplitudeModPx = amplitudeMod.toPx()
|
||||||
|
|
||||||
val halfPeriod = periodPx / 2
|
val halfPeriod = periodPx / 2
|
||||||
val quarterPeriod = periodPx / 4
|
|
||||||
|
|
||||||
drawPath(path, color = color)
|
drawPath(path, color = color)
|
||||||
path.reset()
|
path.reset()
|
||||||
|
|
||||||
val startOffset = (offset / 360.0f) * periodPx
|
val radOffset = Math.toRadians(offset.toDouble()).toFloat()
|
||||||
|
|
||||||
path.moveTo(-startOffset, size.height - baseHeightPx)
|
path.moveTo(0.0f, size.height - baseHeightPx)
|
||||||
|
|
||||||
|
var peakIdx = 0.0f
|
||||||
|
var currentX = 0.0f
|
||||||
|
val maxX = size.width
|
||||||
|
|
||||||
|
while (currentX < maxX) {
|
||||||
|
// using sin is weird because it causes the animation to slow towards the ends
|
||||||
|
// that being said, it is a really cheap way of getting a repeating value between 0 and 1
|
||||||
|
|
||||||
|
val dxFactor = sin(peakIdx + radOffset) * periodModPx
|
||||||
|
val dx = halfPeriod + dxFactor
|
||||||
|
|
||||||
|
val dyFactor = sin(peakIdx + radOffset) * amplitudeModPx
|
||||||
|
val dy = amplitudePx + dyFactor
|
||||||
|
peakIdx += seed
|
||||||
|
|
||||||
repeat(ceil((size.width + startOffset) / periodPx).toInt()) {
|
|
||||||
path.relativeQuadraticBezierTo(
|
path.relativeQuadraticBezierTo(
|
||||||
dx1 = quarterPeriod,
|
dx / 2,
|
||||||
dy1 = -2 * amplitudePx,
|
-dy,
|
||||||
dx2 = halfPeriod,
|
dx,
|
||||||
dy2 = 0f,
|
0.0f
|
||||||
)
|
)
|
||||||
|
|
||||||
path.relativeQuadraticBezierTo(
|
path.relativeQuadraticBezierTo(
|
||||||
dx1 = quarterPeriod,
|
dx / 2,
|
||||||
dy1 = 2 * amplitudePx,
|
dy,
|
||||||
dx2 = halfPeriod,
|
dx,
|
||||||
dy2 = 0f,
|
0.0f
|
||||||
)
|
)
|
||||||
|
|
||||||
|
currentX += dx * 2
|
||||||
}
|
}
|
||||||
|
|
||||||
path.lineTo(size.width, size.height)
|
path.lineTo(size.width, size.height)
|
||||||
|
|||||||
Reference in new issue
Block a user