mirror of
https://github.com/jlengrand/compose-multiplatform.git
synced 2026-03-10 08:11:20 +00:00
Refactor visual-effects and notepad
This commit is contained in:
@@ -34,5 +34,6 @@ fun rememberVectorPainter(image: ImageVector, tintColor: Color) =
|
||||
name = image.name,
|
||||
tintColor = tintColor,
|
||||
tintBlendMode = image.tintBlendMode,
|
||||
autoMirror = false,
|
||||
content = { _, _ -> RenderVectorGroup(group = image.root) }
|
||||
)
|
||||
|
||||
@@ -23,11 +23,11 @@ import java.lang.Math.random
|
||||
import kotlin.math.*
|
||||
import kotlin.random.Random
|
||||
|
||||
val width = 1200
|
||||
val height = 800
|
||||
val snowCount = 80
|
||||
val starCount = 60
|
||||
val rocketPartsCount = 30
|
||||
const val width = 1200
|
||||
const val height = 800
|
||||
const val snowCount = 80
|
||||
const val starCount = 60
|
||||
const val rocketPartsCount = 30
|
||||
|
||||
data class SnowFlake(
|
||||
var x: Dp,
|
||||
@@ -42,14 +42,14 @@ data class SnowFlake(
|
||||
|
||||
data class Star(val x: Dp, val y: Dp, val color: Color, val size: Dp)
|
||||
|
||||
val HNYString = "Happy New Year!"
|
||||
const val HNYString = "Happy New Year!"
|
||||
|
||||
class DoubleRocket(val particle: Particle) {
|
||||
val STATE_ROCKET = 0
|
||||
val STATE_SMALL_ROCKETS = 1
|
||||
private val STATE_ROCKET = 0
|
||||
private val STATE_SMALL_ROCKETS = 1
|
||||
var state = STATE_ROCKET
|
||||
var rockets: Array<Rocket> = emptyArray()
|
||||
fun checkState(time: Long) {
|
||||
private fun checkState(time: Long) {
|
||||
if (particle.vy > -3.0 && state == STATE_ROCKET) {
|
||||
explode(time)
|
||||
}
|
||||
@@ -69,7 +69,7 @@ class DoubleRocket(val particle: Particle) {
|
||||
}
|
||||
}
|
||||
|
||||
fun reset() {
|
||||
private fun reset() {
|
||||
if (particle.vx < 0) return //to stop drawing after the second rocket. This could be commented out
|
||||
state = STATE_ROCKET
|
||||
particle.x = if (particle.vx > 0) width - 0.0 else 0.0
|
||||
@@ -78,9 +78,9 @@ class DoubleRocket(val particle: Particle) {
|
||||
particle.vy = -12.5
|
||||
}
|
||||
|
||||
fun explode(time: Long) {
|
||||
private fun explode(time: Long) {
|
||||
val colors = arrayOf(Color(0xff, 0, 0), Color(192, 255, 192), Color(192, 212, 255))
|
||||
rockets = Array<Rocket>(7) {
|
||||
rockets = Array(7) {
|
||||
val v = 1.2f + 1.0 * random()
|
||||
val angle = 2 * PI * random()
|
||||
Rocket(
|
||||
@@ -131,8 +131,8 @@ class Rocket(val particle: Particle, val color: Color, val startTime: Long = 0)
|
||||
}
|
||||
}
|
||||
|
||||
fun explode() {
|
||||
parts = Array<Particle>(rocketPartsCount) {
|
||||
private fun explode() {
|
||||
parts = Array(rocketPartsCount) {
|
||||
val v = 0.5f + 1.5 * random()
|
||||
val angle = 2 * PI * random()
|
||||
Particle(particle.x, particle.y, v * sin(angle) + particle.vx, v * cos(angle) + particle.vy, color, 1)
|
||||
@@ -202,7 +202,7 @@ val rocket = DoubleRocket(Particle(0.0, 1000.0, 2.1, -12.5, Color.White))
|
||||
@Composable
|
||||
fun NYWindow(onCloseRequest: () -> Unit) {
|
||||
val windowState = remember { WindowState(width = width.dp, height = height.dp) }
|
||||
Window(onCloseRequest = {}, undecorated = true, transparent = true, state = windowState) {
|
||||
Window(onCloseRequest = onCloseRequest, undecorated = true, transparent = true, state = windowState) {
|
||||
NYContent()
|
||||
}
|
||||
}
|
||||
@@ -249,9 +249,7 @@ fun NYContent() {
|
||||
remember { prepareStarsAndSnowFlakes(stars, snowFlakes) }
|
||||
|
||||
Surface(
|
||||
modifier = Modifier.fillMaxSize().padding(5.dp).shadow(3.dp, RoundedCornerShape(20.dp))
|
||||
.pointerMoveFilter(onMove = { false; },
|
||||
onEnter = { false; }, onExit = { false; }),
|
||||
modifier = Modifier.fillMaxSize().padding(5.dp).shadow(3.dp, RoundedCornerShape(20.dp)),
|
||||
color = Color.Black,
|
||||
shape = RoundedCornerShape(20.dp)
|
||||
) {
|
||||
@@ -266,7 +264,7 @@ fun NYContent() {
|
||||
}
|
||||
|
||||
if (!started) { //animation starts with delay, so there is some time to start recording
|
||||
if (time - startTime > 7000000000 && time - startTime < 7100000000) println("ready!")
|
||||
if (time - startTime in 7000000001..7099999999) println("ready!")
|
||||
if (time - startTime > 10000000000) {
|
||||
startTime = time //restarting timer
|
||||
started = true
|
||||
@@ -303,7 +301,7 @@ fun NYContent() {
|
||||
color = Color.White
|
||||
)
|
||||
|
||||
if (started) { //delay to be able start recording
|
||||
if (started) { //delay to be able to start recording
|
||||
//HNY
|
||||
var i = 0
|
||||
val angle = (HNYString.length / 2 * 5) * -1.0f
|
||||
@@ -370,7 +368,7 @@ fun flickeringAlpha(time: Long): Float {
|
||||
val time = (time / 10000000) % 100
|
||||
var result = 0.2f
|
||||
if (time > 75) {
|
||||
result = result + 0.6f * ((time - 75) % 3) / 3
|
||||
result += 0.6f * ((time - 75) % 3) / 3
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ import androidx.compose.ui.ExperimentalComposeUiApi
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.*
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.input.pointer.PointerEventType
|
||||
import androidx.compose.ui.input.pointer.onPointerEvent
|
||||
import androidx.compose.ui.input.pointer.pointerMoveFilter
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
@@ -20,7 +22,7 @@ import kotlin.math.*
|
||||
|
||||
@Composable
|
||||
fun WaveEffect(onCloseRequest: () -> Unit, showControls: Boolean) {
|
||||
var windowState = remember { WindowState(width = 1200.dp, height = 800.dp) }
|
||||
val windowState = remember { WindowState(width = 1200.dp, height = 800.dp) }
|
||||
Window(onCloseRequest = {}, undecorated = true, transparent = true, state = windowState) {
|
||||
Grid()
|
||||
}
|
||||
@@ -70,8 +72,16 @@ fun Grid() {
|
||||
|
||||
Surface(
|
||||
modifier = Modifier.fillMaxSize().padding(5.dp).shadow(3.dp, RoundedCornerShape(20.dp))
|
||||
.pointerMoveFilter(onMove = { mouseX = it.x.toInt(); mouseY = it.y.toInt(); false; },
|
||||
onEnter = { State.mouseUsed = true; false; }, onExit = { State.mouseUsed = false; false; }),
|
||||
.onPointerEvent(PointerEventType.Move) {
|
||||
mouseX = it.changes.first().position.x.toInt()
|
||||
mouseY = it.changes.first().position.y.toInt()
|
||||
}
|
||||
.onPointerEvent(PointerEventType.Enter) {
|
||||
State.mouseUsed = true
|
||||
}
|
||||
.onPointerEvent(PointerEventType.Exit) {
|
||||
State.mouseUsed = false
|
||||
},
|
||||
color = Color(0, 0, 0),
|
||||
shape = RoundedCornerShape(20.dp)
|
||||
) {
|
||||
@@ -80,13 +90,13 @@ fun Grid() {
|
||||
var y = 10 // initial position
|
||||
val shift = 25
|
||||
var evenRow = false
|
||||
var pointerOffsetX = (centerX / 2)
|
||||
var pointerOffsety = (centerY / 2)
|
||||
val pointerOffsetX = (centerX / 2)
|
||||
val pointerOffsety = (centerY / 2)
|
||||
while (y < 790) {
|
||||
x = if (evenRow) 10 + shift else 10
|
||||
while (x < 1190) {
|
||||
var size: Int = size(x, y, pointerOffsetX, pointerOffsety)
|
||||
var color = boxColor(x, y, time, pointerOffsetX, pointerOffsety)
|
||||
val size: Int = size(x, y, pointerOffsetX, pointerOffsety)
|
||||
val color = boxColor(x, y, time, pointerOffsetX, pointerOffsety)
|
||||
Dot(size, Modifier.offset(x.dp, y.dp), color, time)
|
||||
x += shift * 2
|
||||
}
|
||||
@@ -111,19 +121,19 @@ fun Grid() {
|
||||
fun HighPanel(mouseX: Int, mouseY: Int) {
|
||||
Text(
|
||||
"Compose",
|
||||
androidx.compose.ui.Modifier.offset(270.dp, 600.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 270, 700)),
|
||||
Modifier.offset(270.dp, 600.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 270, 700)),
|
||||
color = colorMouse(mouseX, mouseY, 270, 700),
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
Text(
|
||||
"Multiplatform",
|
||||
androidx.compose.ui.Modifier.offset(350.dp, 700.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 550, 800)),
|
||||
Modifier.offset(350.dp, 700.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 550, 800)),
|
||||
color = colorMouse(mouseX, mouseY, 550, 800),
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
Text(
|
||||
"1.0",
|
||||
androidx.compose.ui.Modifier.offset(800.dp, 700.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 800, 800)),
|
||||
Modifier.offset(800.dp, 700.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 800, 800)),
|
||||
color = colorMouse(mouseX, mouseY, 800, 800),
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
@@ -137,7 +147,7 @@ private fun alpha(mouseX: Int, mouseY: Int, x: Int, y: Int): Float {
|
||||
}
|
||||
|
||||
private fun colorMouse(mouseX: Int, mouseY: Int, x: Int, y: Int): Color {
|
||||
var d = distance(mouseX, mouseY, x, y) / 450
|
||||
val d = distance(mouseX, mouseY, x, y) / 450
|
||||
val color1 = Color(0x6B, 0x57, 0xFF)
|
||||
val color2 = Color(0xFE, 0x28, 0x57)
|
||||
val color3 = Color(0xFD, 0xB6, 0x0D)
|
||||
@@ -178,7 +188,7 @@ private fun size(x: Int, y: Int, mouseX: Int, mouseY: Int): Int {
|
||||
var result = 5
|
||||
if (y > 550 && x < 550) return result
|
||||
if (y > 650 && x < 900) return result
|
||||
var distance2 = sqrt((x - mouseX) * (x - mouseX) + (y - mouseY) * (y - mouseY).toDouble()) / 200
|
||||
val distance2 = sqrt((x - mouseX) * (x - mouseX) + (y - mouseY) * (y - mouseY).toDouble()) / 200
|
||||
val scale: Double = (if (distance2 < 1) {
|
||||
addSize * (1 - distance2)
|
||||
} else 0.toDouble())
|
||||
@@ -205,13 +215,13 @@ private fun boxColor(x: Int, y: Int, time: Long, mouseX: Int, mouseY: Int): Colo
|
||||
var color = Color.White
|
||||
|
||||
if (c1 <= 0) {
|
||||
var d = c2 / (c2 + c3)
|
||||
val d = c2 / (c2 + c3)
|
||||
color = balancedColor(d, color2, color3)
|
||||
} else if (c2 <= 0) {
|
||||
var d = c3 / (c1 + c3)
|
||||
val d = c3 / (c1 + c3)
|
||||
color = balancedColor(d, color3, color1)
|
||||
} else if (c3 <= 0) {
|
||||
var d = c1 / (c1 + c2)
|
||||
val d = c1 / (c1 + c2)
|
||||
color = balancedColor(d, color1, color2)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user