Módulos

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 clases Stroke o InProgressStroke, 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 un ImmutableStrokeInputBatch (puntos de entrada), un Brush (estilo) y una PartitionedMesh (forma geométrica). Los trazos se pueden almacenar, manipular y renderizar tu aplicación.
  • InProgressStroke: Representación mutable de Stroke 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 indirectamente InProgressStrokesView, 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.