Класс TextPainter
Класс TextPainter раскладывает строку или дерево
InlineSpan и сообщает размер блока. Текст задают
в text, направление - в textDirection,
масштаб - через TextScaler.
После layout
доступны width и height, рисование - через
paint.
Позицию курсора дают
getOffsetForCaret
и getPositionForOffset.
Синтаксис
TextPainter(
text: TextSpan(text: 'abcde'),
textDirection: TextDirection.ltr,
)
Параметры
| Параметр | Описание |
|---|---|
text |
Строка или дерево фрагментов. Принимает InlineSpan.
|
textDirection |
Направление письма. Принимает TextDirection.
|
Методы
| Метод | Описание |
|---|---|
computeLineMetrics |
Возвращает размеры и смещения каждой строки. |
getOffsetForCaret |
Возвращает координаты курсора для позиции в тексте. |
getPositionForOffset |
Находит текстовую позицию по координатам на экране. |
layout |
Вычисляет размер текста и переносы строк. Давайте рассмотрим его на примерах. |
markNeedsLayout |
Помечает, что текст нужно пересчитать. Давайте рассмотрим его на примерах. |
paint |
Выводит разложенный текст на Canvas. Давайте рассмотрим его на примерах.
|
Пример
Давайте измерим текст и нарисуем его на холсте:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: CustomPaint(
painter: _MeasurePainter(),
size: Size(200, 40),
),
),
),
),
);
}
class _MeasurePainter extends CustomPainter
{
@override
void paint(Canvas canvas, Size size)
{
TextPainter painter = TextPainter(
text: TextSpan(
text: 'abcde',
style: TextStyle(fontSize: 16, color: Colors.black),
),
textDirection: TextDirection.ltr,
);
painter.layout(maxWidth: size.width);
painter.paint(canvas, Offset.zero);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}
На экране появится строка 'abcde': после layout
paint знает, сколько места занять на Canvas.
Пример
Давайте перенесём длинный текст узкой шириной:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: CustomPaint(
painter: _WrapPainter(),
size: Size(80, 80),
),
),
),
),
);
}
class _WrapPainter extends CustomPainter
{
@override
void paint(Canvas canvas, Size size)
{
TextPainter painter = TextPainter(
text: TextSpan(
text: 'abcde 12345',
style: TextStyle(fontSize: 14, color: Colors.black),
),
textDirection: TextDirection.ltr,
);
painter.layout(maxWidth: size.width);
painter.paint(canvas, Offset.zero);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}
На экране текст займёт несколько строк: layout
разбил его по ширине 80, затем paint вывел блок.