La API de Ink está modularizada, por lo que solo puedes usar lo que necesites.
Trazos
El módulo Strokes sirve de base para la biblioteca de Ink, ya que ofrece interfaz de API principal y que contiene los tipos de datos principales para interactuar con la biblioteca. Entre los tipos de datos clave de este módulo, se incluyen los siguientes:
StrokeInputBatch
: Representa una serie de entradas de puntero, que abarcan la posición, la marca de tiempo y, de manera opcional, la presión, la inclinación y la orientación. Estos datos se pueden usar con las clasesStroke
oInProgressStroke
, y son el tipo que proporcionaría las entradas para una biblioteca de reconocimiento de escritura a mano.Stroke
: Es una representación inmutable de un trazo finalizado con geometría fija. El trazo comprende unImmutableStrokeInputBatch
(puntos de entrada), unBrush
(estilo) y unaPartitionedMesh
(forma geométrica). Los trazos se pueden almacenar, manipular y renderizar tu aplicación.InProgressStroke
: Representación mutable deStroke
diseñada para el manejo incremental de entradas y la renderización en tiempo real durante el proceso de dibujo. Si bien se suele usar indirectamenteInProgressStrokesView
,InProgressStroke
se puede aprovechar directamente para una personalización avanzada.
Geometría
El módulo Geometría ofrece un conjunto de primitivas geométricas para las operaciones básicas y complejas formas junto con operaciones de detección y transformaciones de intersección. Estas primitivas se integran fácilmente en los trazos de Ink, lo que te permite crear funciones como borradores de trazo completo y herramientas de selección de marquesina.
Si bien clases como Box
y Vec
facilitan principalmente las operaciones geométricas, PartitionedMesh
también puede incluir datos específicos de renderización.
Pincel
El módulo Brush actúa como una configuración declarativa para la creación y renderización de trazos, y funciona de manera similar a una fuente de texto. Un objeto Brush
tiene las siguientes propiedades:
- Color: Puede ser un color sólido o la base para efectos en capas y texturas.
- Tamaño: Puede ser fijo o funcionar como base para ajustes de tamaño dinámicos.
- Familia: Al igual que un tipo de letra de texto, la familia define el estilo general del trazo.
- Epsilon: Controla el nivel de detalle en la geometría vectorial del trazo. que representan la unidad más pequeña de distinción visual.
La propiedad epsilon
juega un rol fundamental en la definición de la precisión de tu sistema de coordenadas. Más indicaciones
se proporciona en la sección de las APIs de Brush.
para elegir un valor de épsilon adecuado.
El elemento BrushFamily
funciona como
una potente configuración para crear trazos expresivos sin adentrarse en
geometría compleja o código de renderización. La biblioteca proporciona un conjunto de StockBrushes
predefinidos, incluidos un lápiz sensible a la presión, un marcador y un resaltador.
Autoría
El módulo Authoring
permite a los desarrolladores capturar la entrada táctil del usuario y renderizarla como trazos de baja latencia en la pantalla en tiempo real. Esto se logra a través de la clase InProgressStrokesView
, que procesa los eventos de movimiento y visualiza los trazos a medida que se dibujan.
Una vez que se completa un trazo, el módulo notifica a la aplicación cliente mediante el
onStrokesFinished()
devolución de llamada de
InProgressStrokesFinishedListener
La devolución de llamada permite que la aplicación recupere los datos del trazo terminado para la renderización o el almacenamiento.
Renderización
El módulo de renderización simplifica el proceso de dibujar trazos de tinta en un Canvas
de Android. El módulo proporciona un CanvasStrokeRenderer
para Compose y un ViewStrokeRenderer
para diseños basados en vistas, que optimizan el rendimiento de la renderización y garantizan imágenes de alta calidad, incluido el suavizado de bordes.
Para renderizar trazos en un lienzo, obtén una instancia de CanvasStrokeRenderer
con el método create()
. Luego, usa el método draw()
para renderizar trazos terminados o en curso en un lienzo.
El lienzo se puede transformar (desplazar, acercar o rotar) como parte del dibujo del trazo, pero para asegurarse de que el trazo se vea lo mejor posible en la pantalla, la transformación aplicada al lienzo también se debe pasar a CanvasStrokeRenderer#draw()
.
Para evitar tener que hacer un seguimiento de esto por separado, usa
ViewStrokeRenderer
en su lugar.