Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
108 of 1024 menu
◀ ▶

Класс 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 вывел блок.

Смотрите также

  • метод layout,
    который считает переносы и размер
  • метод paint,
    который рисует текст на Canvas
  • класс TextSpan,
    который передаётся в поле text
  • виджет Text,
    который рисует текст без TextPainter вручную
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить