Flutter文本弧形排列插件text_x_arc的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter文本弧形排列插件text_x_arc的使用

text_x_arc 是一个用于在画布上绘制弧形文本的辅助工具。

该插件受到 flutter_arc_text 的启发。如果你只是想让文本沿弧线排列,直接使用 flutter_arc_text 就可以了。

这个包是为我的特殊需求开发的,所以可能不完全符合你的需求。考虑使用这个包,如果你需要:

  • 在画布上沿弧线绘制文本
  • 关注起始角度和结束角度
  • 移除超出范围(从起始角度到结束角度)的所有字母
  • 当文本比弧线短时,进行居中对齐
  • 自定义字符间距
  • 跟踪在画布上绘制弧形文本时发生的情况

基本用法

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:text_x_arc/text_x_arc.dart';

void main() {
  runApp(CustomPaint(
    painter: MyPainter(),
  ));
}

class MyPainter extends CustomPainter {
  [@override](/user/override)
  void paint(Canvas canvas, Size size) {
    // 设置中心点
    final centerPos = Offset(size.width / 2, size.height / 2);
    
    // 创建文本绘制器
    TextPainter textPainter = TextPainter(
        textAlign: TextAlign.justify, textDirection: TextDirection.ltr);
    
    // 绘制弧形文本
    XArcTextDrawer.draw(
        canvas: canvas,
        centerPos: centerPos,
        radius: 200, // 半径
        text: 
            'Without requirements or design, programming is the art of adding bugs to an empty text file.', // 文本内容
        textStyle: TextStyle(color: Colors.black, fontSize: 20), // 文本样式
        textPainter: textPainter);
  }

  [@override](/user/override)
  bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
}

你可以查看 playground 示例 获取更多信息。

完整示例代码

以下是一个更完整的示例代码,展示了如何使用 text_x_arc 插件来绘制带有自定义参数的弧形文本。

import 'package:dashbook/dashbook.dart';
import 'package:flutter/material.dart';
import 'package:text_x_arc/text_x_arc.dart';

void main() {
  final dashbook = Dashbook(
    theme: ThemeData(),
  );
  
  dashbook.storiesOf('XArtTextDrawer').decorator(CenterDecorator()).add(
    'Arc Text',
    (context) => Container(
      width: 300,
      child: CustomPaint(
        painter: ArcTextPainter(
          ArcTextExampleModel(
            startAngle: context.numberProperty('start Angle(degree)', 90),
            endAngle: context.numberProperty('end Angle(degree)', 90),
            baseline: context.listProperty('text baseline', ArcTextBaseline.Outer, ArcTextBaseline.values),
            letterSpacing: context.numberProperty('letter spacing', 0.0).toInt(),
            radius: context.numberProperty('radius', 200),
            text: context.textProperty('text', 'Without requirements or design, programming is the art of adding bugs to an empty text file.'),
            textDirection: context.listProperty('text direction', ArcTextDirection.Clockwise, ArcTextDirection.values),
            drawCircle: context.boolProperty('draw circle', true),
            style: TextStyle(
              backgroundColor: context.colorProperty('background', Colors.white),
              color: context.colorProperty('text color', Colors.black),
              fontSize: context.numberProperty('font size', 20),
              fontStyle: context.listProperty('font style', FontStyle.normal, FontStyle.values),
              fontWeight: context.listProperty('font weight', FontWeight.normal, FontWeight.values)
            )
          ),
        ),
      ),
    ),
  );
  
  runApp(dashbook);
}

// 模型类,包含所有参数
class ArcTextExampleModel {
  double radius;
  double startAngle;
  double endAngle;
  ArcTextDirection textDirection;
  String text;
  int letterSpacing;
  ArcTextBaseline baseline;
  bool drawCircle;
  TextStyle style;

  ArcTextExampleModel({
    required this.radius,
    required this.startAngle,
    required this.endAngle,
    required this.textDirection,
    required this.text,
    required this.letterSpacing,
    required this.baseline,
    required this.drawCircle,
    required this.style,
  });
}

// 自定义绘制器类
class ArcTextPainter extends CustomPainter {
  final ArcTextExampleModel model;

  ArcTextPainter(this.model);

  [@override](/user/override)
  void paint(Canvas canvas, Size size) {
    // 设置中心点
    final centerPos = Offset(size.width / 2, size.height / 2);
    
    // 创建文本绘制器
    TextPainter textPainter = TextPainter(
      textAlign: TextAlign.justify, textDirection: TextDirection.ltr
    );
    
    // 绘制弧形文本
    XArcTextDrawer.draw(
      canvas: canvas,
      centerPos: centerPos,
      radius: model.radius,
      startAngle: model.startAngle,
      endAngle: model.endAngle,
      textArcDirection: model.textDirection,
      text: model.text,
      textStyle: model.style,
      baseline: model.baseline,
      textPainter: textPainter,
      letterSpacing: model.letterSpacing,
    );

    // 绘制圆圈(如果需要)
    if (model.drawCircle) {
      canvas.drawCircle(centerPos, model.radius, Paint()..style = PaintingStyle.stroke);
    }
  }

  [@override](/user/override)
  bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
}

更多关于Flutter文本弧形排列插件text_x_arc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文本弧形排列插件text_x_arc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter文本弧形排列插件 text_x_arc 的代码案例。这个插件允许你将文本按照弧形排列,非常适合创建独特的UI效果。

首先,你需要在你的 pubspec.yaml 文件中添加 text_x_arc 依赖:

dependencies:
  flutter:
    sdk: flutter
  text_x_arc: ^最新版本号  # 请替换为实际的最新版本号

然后运行 flutter pub get 来获取依赖。

接下来是一个使用 text_x_arc 的完整示例代码:

import 'package:flutter/material.dart';
import 'package:text_x_arc/text_x_arc.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Text Arc Example'),
        ),
        body: Center(
          child: ArcTextWidget(),
        ),
      ),
    );
  }
}

class ArcTextWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 300,
      height: 300,
      decoration: BoxDecoration(
        border: Border.all(color: Colors.grey, width: 2),
        shape: BoxShape.circle,
      ),
      child: ArcText(
        text: 'Flutter Text Arc',
        style: TextStyle(
          fontSize: 24,
          color: Colors.blue,
        ),
        alignment: Alignment.center,
        startAngle: -pi / 2,  // 开始角度,这里是 -90 度(从上往下开始)
        sweepAngle: pi,       // 扫过的角度,这里是 180 度(半圆)
        radius: 140,          // 弧的半径
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个简单的 Flutter 应用,包含一个 ArcTextWidget
  2. ArcTextWidget 使用 Container 来限制文本的显示区域,并添加一个圆形边框以便更清楚地看到文本弧形的效果。
  3. ArcText 组件接受多个参数:
    • text:要显示的文本。
    • style:文本的样式,如字体大小和颜色。
    • alignment:文本的对齐方式,这里使用 Alignment.center 表示在弧的中心位置开始排列文本。
    • startAngle:开始角度,使用 -pi / 2 表示从上往下开始(即 -90 度)。
    • sweepAngle:扫过的角度,使用 pi 表示 180 度(即半圆)。
    • radius:弧的半径,这里设置为 140。

你可以根据需要调整这些参数来创建不同的弧形文本效果。希望这个示例对你有帮助!

回到顶部