首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Paragraph.getBoxesForRange究竟得到了什么?

Paragraph.getBoxesForRange究竟得到了什么?
EN

Stack Overflow用户
提问于 2020-12-11 09:58:54
回答 1查看 149关注 0票数 1

颤振中的段落类有一个名为getBoxesForRange的方法。

文档说:

返回包含给定文本范围的文本框列表。

但是,我不清楚这些框是包含给定范围的文本行周围的框,还是其他的框。

在做了进一步的研究之后,我找到了一个答案,我在下面添加。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-11 09:58:54

简短回答

Paragraph.getBoxesForRange给出了如果选择的话,它实际上是给定范围的突出显示区域。如果范围包装到一个新行(或者包含混合的双向文本),您将得到多个框。

较长答案

给定字符串:

代码语言:javascript
复制
Hello, world.

如果您将范围从18,如下所示:

代码语言:javascript
复制
final boxes = paragraph.getBoxesForRange(1, 8);

这会给你一个盒子:

代码语言:javascript
复制
[
  TextBox.fromLTRBD(22.3, -0.3, 112.0, 35.0, TextDirection.ltr)
]

用图形表示,它将如下所示:

这表明这些框不是完整的行,而是仅包装指定的文本范围。

如果限制宽度,使段落被迫换行文本,则会得到以下内容:

代码语言:javascript
复制
[
  TextBox.fromLTRBD(22.3, -0.3, 47.0, 35.0, TextDirection.ltr), 
  TextBox.fromLTRBD(0.0, 34.7, 41.8, 70.0, TextDirection.ltr), 
  TextBox.fromLTRBD(0.0, 69.7, 23.2, 105.0, TextDirection.ltr)
]

全码

这是完整的代码,如果你想玩它自己。

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'dart:ui' as ui;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: HomeWidget(),
      ),
    );
  }
}

class HomeWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: CustomPaint(
        size: Size(300, 300),
        painter: MyPainter(),
      ),
    );
  }
}

class MyPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    final textStyle = ui.TextStyle(
      color: Colors.black,
      fontSize: 30,
    );
    final paragraphStyle = ui.ParagraphStyle(
      textDirection: TextDirection.ltr,
    );
    final paragraphBuilder = ui.ParagraphBuilder(paragraphStyle)
      ..pushStyle(textStyle)
      ..addText('Hello, world.');
    final constraints = ui.ParagraphConstraints(width: 300);
    // final constraints = ui.ParagraphConstraints(width: 50);
    final paragraph = paragraphBuilder.build();
    paragraph.layout(constraints);
    canvas.drawParagraph(paragraph, Offset.zero);

    final boxes = paragraph.getBoxesForRange(1, 8);
    print(boxes);
    final paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.stroke
      ..strokeWidth = 1;
    for (final box in boxes) {
      final rect = Rect.fromLTRB(box.left, box.top, box.right, box.bottom);
      canvas.drawRect(rect, paint);
    }
  }

  @override
  bool shouldRepaint(CustomPainter old) {
    return false;
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65249200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档