Módulos

A API Ink é modularizada, então você pode usar apenas o que precisa.

Traços

O módulo Strokes serve como base da biblioteca Ink, oferecendo a interface principal da API e contendo os tipos de dados principais para interagir com a biblioteca. Os principais tipos de dados neste módulo incluem:

  • StrokeInputBatch: Representa uma série de entradas de ponteiro, incluindo posição, carimbo de data/hora e opcionalmente pressão, inclinação e orientação. Esses dados podem ser usados com as classes Stroke ou InProgressStroke e são o tipo que forneceria as entradas para uma biblioteca de reconhecimento de escrita à mão.
  • Stroke: uma representação imutável de um traço finalizado com geometria fixa. O traço é composto por um ImmutableStrokeInputBatch (pontos de entrada), um Brush (estilo) e um PartitionedMesh (forma geométrica). Os traços podem ser armazenados, manipulados e renderizados no seu aplicativo.
  • InProgressStroke: Uma contraparte mutável do Stroke criado para processamento de entrada incremental e renderização em tempo real durante o desenho de desenvolvimento de software. Embora muitas vezes usado indiretamente por meio de InProgressStrokesView, InProgressStroke podem ser aproveitadas diretamente para personalização avançada.

Geometria

O módulo Geometry oferece um conjunto de primitivos geométricos para conceitos básicos e formas, juntamente com operações para detecção e transformações de interseções. Esses primitivos se integram perfeitamente aos traços de tinta, permitindo que você crie como borrachas e ferramentas de seleção de letreiros.

Já classes como Box e Vec facilitam principalmente operações geométricas, PartitionedMesh pode também incluem dados específicos de renderização.

Brush

O módulo Brush atua como uma configuração declarativa para criação e renderização de traços, funcionando de forma semelhante a uma fonte de texto. Um objeto Brush tem as seguintes propriedades:

  • Cor: pode ser uma cor sólida ou a base para efeitos e texturas em camadas.
  • Tamanho: pode ser fixo ou servir como base para ajustes dinâmicos.
  • Família: análoga a uma família tipográfica de texto, família define a largura total do traço estilo.
  • Epsilon: controla o nível de detalhes na geometria vetorial do traço, representando a menor unidade de distinção visual.

A propriedade epsilon desempenha um papel crucial na definição da precisão do sistema de coordenadas. Mais orientações são fornecidas na seção APIs de pincel sobre como escolher um valor de epsilon adequado.

O BrushFamily serve como uma configuração poderosa para criar traços expressivos sem se aprofundar em geometria complexa ou código de renderização. A biblioteca oferece um conjunto de StockBrushes predefinidos, incluindo uma caneta, um marcador e um marcador de sublinhado sensíveis à pressão.

Criação

O Authoring permite que os desenvolvedores capturem a entrada de toque do usuário e renderizem-na como traços de baixa latência na tela em tempo real. Isso é feito pela classe InProgressStrokesView, que processa eventos de movimento e visualiza os traços conforme eles são desenhados.

Quando um traço é concluído, o módulo notifica o aplicativo cliente usando o callback onStrokesFinished() de InProgressStrokesFinishedListener. O callback permite que o aplicativo recupere o dados de traço finalizados para renderização ou armazenamento.

Renderização

O módulo "Renderização" simplifica o processo de desenhar traços de tinta em uma Android Canvas O módulo oferece um CanvasStrokeRenderer para o Compose e ViewStrokeRenderer para layouts baseados em visualizações. Ambos otimizam o desempenho de renderização e garantem visualizações de alta qualidade, incluindo anti-aliasing.

Para renderizar traços em uma tela, extraia uma instância de CanvasStrokeRenderer usando o método create(). Em seguida, use o método draw() para renderizar traços finalizados ou em andamento. traços em uma tela.

A tela pode ser transformada (movimentada, ampliada ou girada) como parte do desenho do No entanto, para garantir que o traço tenha a melhor aparência desenhada na tela, aplicada ao canvas também precisam ser passadas para CanvasStrokeRenderer#draw(): Para evitar a necessidade de acompanhar isso separadamente, use ViewStrokeRenderer como alternativa.