Saltar a contenido

8.5 Gestos y dibujo personalizado

Arrastrar

var desplazamiento by remember { mutableStateOf(Offset.Zero) }

Box(
    Modifier
        .offset { IntOffset(desplazamiento.x.roundToInt(), desplazamiento.y.roundToInt()) }
        .size(80.dp).background(Color.Magenta)
        .pointerInput(Unit) {
            detectDragGestures { cambio, arrastre ->
                cambio.consume()
                desplazamiento += arrastre
            }
        }
)

Toque, doble toque y pulsación larga

Modifier.pointerInput(Unit) {
    detectTapGestures(
        onTap = { },
        onDoubleTap = { },
        onLongPress = { }
    )
}

Pellizcar para ampliar

var zoom by remember { mutableStateOf(1f) }
Image(
    painterResource(R.drawable.mapa), null,
    Modifier.graphicsLayer(scaleX = zoom, scaleY = zoom)
        .pointerInput(Unit) { detectTransformGestures { _, _, z, _ -> zoom = (zoom * z).coerceIn(1f, 5f) } }
)

Dibujar con Canvas

Canvas es un lienzo donde dibujas formas con código:

Canvas(Modifier.size(200.dp)) {
    drawRect(Color.LightGray, size = size)
    drawCircle(Color.Red, radius = 50.dp.toPx(), center = center)
    drawLine(Color.Black, start = Offset(0f, 0f), end = Offset(size.width, size.height), strokeWidth = 4f)
}

Es la base para gráficas, indicadores circulares o juegos sencillos. Ejemplo de gráfico de barras:

@Composable
fun Barras(valores: List<Float>, modifier: Modifier = Modifier) {
    val maximo = valores.max()
    Canvas(modifier.fillMaxWidth().height(160.dp)) {
        val ancho = size.width / (valores.size * 2f)
        valores.forEachIndexed { i, v ->
            val alto = size.height * (v / maximo)
            drawRect(Color(0xFF3DDC84), topLeft = Offset(ancho * (2 * i + 0.5f), size.height - alto), size = Size(ancho, alto))
        }
    }
}