You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.8 KiB
135 lines
4.8 KiB
4 years ago
|
# Getting Started with Compose for Desktop
|
||
|
|
||
|
## What is covered
|
||
|
|
||
4 years ago
|
In this tutorial we will see how to install mouse event listeners on components
|
||
4 years ago
|
in Compose for Desktop.
|
||
|
|
||
|
## Mouse event listeners
|
||
|
|
||
4 years ago
|
### Click listeners
|
||
|
|
||
|
Click listeners are available in both Compose on Android and Compose for Desktop,
|
||
4 years ago
|
so code like this will work on both platforms:
|
||
4 years ago
|
|
||
4 years ago
|
```kotlin
|
||
|
import androidx.compose.desktop.Window
|
||
|
import androidx.compose.foundation.Text
|
||
4 years ago
|
import androidx.compose.foundation.clickable
|
||
4 years ago
|
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
|
||
|
|
||
4 years ago
|
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
|
||
|
|
||
4 years ago
|
As typically mouse and other positional pointers are only available on desktop platforms,
|
||
|
the following code will only work with Compose for Desktop.
|
||
|
Let's create a window and install a pointer move filter on it that changes the background
|
||
|
color according to the mouse pointer position:
|
||
4 years ago
|
```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
|
||
4 years ago
|
|
||
|
fun main() = Window(title = "Compose for Desktop", size = IntSize(400, 400)) {
|
||
4 years ago
|
var color = remember { mutableStateOf(Color(0, 0, 0)) }
|
||
|
Box(
|
||
4 years ago
|
modifier = Modifier
|
||
|
.wrapContentSize(Alignment.Center)
|
||
4 years ago
|
.fillMaxSize()
|
||
|
.background(color = color.value)
|
||
4 years ago
|
.pointerMoveFilter(
|
||
4 years ago
|
onMove = {
|
||
|
color.value = Color(it.x.toInt() % 256, it.y.toInt() % 256, 0)
|
||
|
false
|
||
|
}
|
||
|
)
|
||
4 years ago
|
)
|
||
|
}
|
||
4 years ago
|
```
|
||
|
|
||
|
![Application running](mouse_move.gif)
|
||
4 years ago
|
|
||
4 years ago
|
### 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"
|
||
|
)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
4 years ago
|
```
|
||
4 years ago
|
![Application running](mouse_enter.gif)
|