Nikolay Igotti
4 years ago
committed by
GitHub
5 changed files with 138 additions and 1 deletions
@ -0,0 +1,135 @@ |
|||||||
|
# Getting Started with Compose for Desktop |
||||||
|
|
||||||
|
## What is covered |
||||||
|
|
||||||
|
In this tutorial we will see how to install mouse events listeners on components |
||||||
|
in Compose for Desktop. |
||||||
|
|
||||||
|
## Mouse event listeners |
||||||
|
|
||||||
|
### Click listeners |
||||||
|
|
||||||
|
Click listeners are available in both Compose on Android and Compose for Desktop, |
||||||
|
so code like that will work on both platforms: |
||||||
|
|
||||||
|
```kotlin |
||||||
|
import androidx.compose.desktop.Window |
||||||
|
import androidx.compose.foundation.Text |
||||||
|
import androidx.compose.foundation.clickable |
||||||
|
import androidx.compose.foundation.layout.* |
||||||
|
import androidx.compose.runtime.mutableStateOf |
||||||
|
import androidx.compose.runtime.remember |
||||||
|
import androidx.compose.ui.Alignment |
||||||
|
import androidx.compose.ui.Modifier |
||||||
|
import androidx.compose.ui.unit.IntSize |
||||||
|
import androidx.compose.ui.unit.sp |
||||||
|
|
||||||
|
fun main() = Window(title = "Compose for Desktop", size = IntSize(400, 400)) { |
||||||
|
var count = 0 |
||||||
|
Box(alignment = Alignment.Center, modifier = Modifier.fillMaxWidth()) { |
||||||
|
var text = remember { mutableStateOf("Click me!") } |
||||||
|
Text( |
||||||
|
text = text.value, |
||||||
|
fontSize = 50.sp, |
||||||
|
modifier = Modifier |
||||||
|
.clickable( |
||||||
|
onClick = { |
||||||
|
text.value = "Click! ${count++}" |
||||||
|
}, |
||||||
|
onDoubleClick = { |
||||||
|
text.value = "Double click! ${count++}" |
||||||
|
}, |
||||||
|
onLongClick = { |
||||||
|
text.value = "Long click! ${count++}" |
||||||
|
} |
||||||
|
) |
||||||
|
.align(Alignment.Center) |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
![Application running](mouse_click.gif) |
||||||
|
|
||||||
|
### Mouse move listeners |
||||||
|
|
||||||
|
As typically mouse or other positional pointers are available on a desktop platforms only, |
||||||
|
following code will only work with Compose for Desktop. |
||||||
|
Let's create a text, and install pointer move filter on it, changing the background |
||||||
|
color per mouse pointer position: |
||||||
|
```kotlin |
||||||
|
import androidx.compose.desktop.Window |
||||||
|
import androidx.compose.foundation.background |
||||||
|
import androidx.compose.foundation.layout.* |
||||||
|
import androidx.compose.runtime.mutableStateOf |
||||||
|
import androidx.compose.runtime.remember |
||||||
|
import androidx.compose.ui.Alignment |
||||||
|
import androidx.compose.ui.Modifier |
||||||
|
import androidx.compose.ui.graphics.Color |
||||||
|
import androidx.compose.ui.input.pointer.pointerMoveFilter |
||||||
|
import androidx.compose.ui.unit.IntSize |
||||||
|
|
||||||
|
fun main() = Window(title = "Compose for Desktop", size = IntSize(400, 400)) { |
||||||
|
var color = remember { mutableStateOf(Color(0, 0, 0)) } |
||||||
|
Box( |
||||||
|
modifier = Modifier |
||||||
|
.wrapContentSize(Alignment.Center) |
||||||
|
.fillMaxSize() |
||||||
|
.background(color = color.value) |
||||||
|
.pointerMoveFilter( |
||||||
|
onMove = { |
||||||
|
color.value = Color(it.x.toInt() % 256, it.y.toInt() % 256, 0) |
||||||
|
false |
||||||
|
} |
||||||
|
) |
||||||
|
) |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
![Application running](mouse_move.gif) |
||||||
|
|
||||||
|
### Mouse enter listeners |
||||||
|
|
||||||
|
Compose for Desktop also supports pointer enter and exit handlers, like this: |
||||||
|
```kotlin |
||||||
|
import androidx.compose.desktop.Window |
||||||
|
import androidx.compose.foundation.Text |
||||||
|
import androidx.compose.foundation.background |
||||||
|
import androidx.compose.foundation.layout.* |
||||||
|
import androidx.compose.runtime.mutableStateOf |
||||||
|
import androidx.compose.runtime.remember |
||||||
|
import androidx.compose.ui.Modifier |
||||||
|
import androidx.compose.ui.graphics.Color |
||||||
|
import androidx.compose.ui.input.pointer.pointerMoveFilter |
||||||
|
import androidx.compose.ui.text.font.FontStyle |
||||||
|
import androidx.compose.ui.unit.IntSize |
||||||
|
import androidx.compose.ui.unit.dp |
||||||
|
import androidx.compose.ui.unit.sp |
||||||
|
|
||||||
|
fun main() = Window(title = "Compose for Desktop", size = IntSize(400, 400)) { |
||||||
|
Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { |
||||||
|
repeat(10) { index -> |
||||||
|
var active = remember { mutableStateOf(false) } |
||||||
|
Text( |
||||||
|
modifier = Modifier |
||||||
|
.fillMaxWidth() |
||||||
|
.background(color = if (active.value) Color.Green else Color.White) |
||||||
|
.pointerMoveFilter( |
||||||
|
onEnter = { |
||||||
|
active.value = true |
||||||
|
false |
||||||
|
}, |
||||||
|
onExit = { |
||||||
|
active.value = false |
||||||
|
false |
||||||
|
} |
||||||
|
), |
||||||
|
fontSize = 30.sp, |
||||||
|
fontStyle = if (active.value) FontStyle.Italic else FontStyle.Normal, |
||||||
|
text = "Item $index" |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
![Application running](mouse_enter.gif) |
After Width: | Height: | Size: 1.4 MiB |
After Width: | Height: | Size: 1.0 MiB |
After Width: | Height: | Size: 426 KiB |
Loading…
Reference in new issue