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 classesStroke
ouInProgressStroke
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 umImmutableStrokeInputBatch
(pontos de entrada), umBrush
(estilo) e umPartitionedMesh
(forma geométrica). Os traços podem ser armazenados, manipulados e renderizados no seu aplicativo.InProgressStroke
: Uma contraparte mutável doStroke
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 deInProgressStrokesView
,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.