Flutter 颤振中的曲线文本

Flutter 颤振中的曲线文本,flutter,Flutter,如何在Flex中弯曲文本小部件? 我有一个被文本包围的圆圈,我需要为文本创建这个样式。此外,该圆圈占据屏幕宽度的50%,因此该曲线效果也应该是动态的您可以查看此颤振包。这可能对你帮助不大:也许你可以看看这个颤振包。它可能对您帮助不大:将“dart:math”导入为math; 进口“包装:颤振/材料.省道”; 导入“package:flatter/widgets.dart”; 类CurvedText扩展了无状态小部件{ 常量曲线文本({ 关键点, @需要这个半径, @需要此文本, @需要此.tex

如何在Flex中弯曲文本小部件?
我有一个被文本包围的圆圈,我需要为文本创建这个样式。此外,该圆圈占据屏幕宽度的50%,因此该曲线效果也应该是动态的

您可以查看此颤振包。这可能对你帮助不大:

也许你可以看看这个颤振包。它可能对您帮助不大:

将“dart:math”导入为math;
进口“包装:颤振/材料.省道”;
导入“package:flatter/widgets.dart”;
类CurvedText扩展了无状态小部件{
常量曲线文本({
关键点,
@需要这个半径,
@需要此文本,
@需要此.textStyle,
this.startAngle=0,
}):super(key:key);
最终双半径;
最终字符串文本;
最后的双星缠结;
最终文本样式文本样式;
@凌驾
小部件构建(BuildContext上下文)=>CustomPaint(
画家:画家(
半径
文本,
文本样式,
初始角度:startAngle,
),
);
}
类\u Painter扩展自定义Painter{
_Painter(this.radius,this.text,this.textStyle,{this.initialAngle=0});
最终num半径;
最终字符串文本;
最终双初始角;
最终文本样式文本样式;
final _textpainer=textpainer(textDirection:textDirection.ltr);
@凌驾
空心油漆(帆布,尺寸){
canvas.translate(size.width/2,size.height/2-半径);
如果(初始角度!=0){
最终d=2*半径*数学sin(初始角度/2);
最终旋转角度=_计算旋转角度(0,初始角度);
画布。旋转(旋转角度);
canvas.translate(d,0);
}
双角度=初始角度;
for(int i=0;i
(α+角度)/2;
@凌驾
bool shouldRepaint(CustomPainter oldDelegate)=>true;
}
将“dart:math”导入为数学;
进口“包装:颤振/材料.省道”;
导入“package:flatter/widgets.dart”;
类CurvedText扩展了无状态小部件{
常量曲线文本({
关键点,
@需要这个半径,
@需要此文本,
@需要此.textStyle,
this.startAngle=0,
}):super(key:key);
最终双半径;
最终字符串文本;
最后的双星缠结;
最终文本样式文本样式;
@凌驾
小部件构建(BuildContext上下文)=>CustomPaint(
画家:画家(
半径
文本,
文本样式,
初始角度:startAngle,
),
);
}
类\u Painter扩展自定义Painter{
_Painter(this.radius,this.text,this.textStyle,{this.initialAngle=0});
最终num半径;
最终字符串文本;
最终双初始角;
最终文本样式文本样式;
final _textpainer=textpainer(textDirection:textDirection.ltr);
@凌驾
空心油漆(帆布,尺寸){
canvas.translate(size.width/2,size.height/2-半径);
如果(初始角度!=0){
最终d=2*半径*数学sin(初始角度/2);
最终旋转角度=_计算旋转角度(0,初始角度);
画布。旋转(旋转角度);
canvas.translate(d,0);
}
双角度=初始角度;
for(int i=0;i
(α+角度)/2;
@凌驾
bool shouldRepaint(CustomPainter oldDelegate)=>true;
}

简而言之:你不能,如果你真的想要它,你需要一个字母一个字母地画,这太费劲了,特别是当这是动态的时候。我想我必须改变我的设计。简言之,谢谢:你不能,如果你真的想要它,你就需要一个字母一个字母地画,这太费劲了,特别是当这是动态的时候。我想我必须改变我的设计。谢谢,我想这是一个完整的循环。在我的情况下,我需要像4个不同的部分完全分开彼此。但是看起来真的很有趣,我可能会在其他项目中使用它。谢谢,我想这是一个完整的循环。在我的情况下,我需要像4个不同的部分完全分开彼此。但是看起来真的很有趣,我可能会在其他项目中使用它。谢谢
import 'dart:math' as math;

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

class CurvedText extends StatelessWidget {
  const CurvedText({
    Key key,
    @required this.radius,
    @required this.text,
    @required this.textStyle,
    this.startAngle = 0,
  }) : super(key: key);

  final double radius;
  final String text;
  final double startAngle;
  final TextStyle textStyle;

  @override
  Widget build(BuildContext context) => CustomPaint(
    painter: _Painter(
      radius,
      text,
      textStyle,
      initialAngle: startAngle,
    ),
  );
}

class _Painter extends CustomPainter {
  _Painter(this.radius, this.text, this.textStyle, {this.initialAngle = 0});

  final num radius;
  final String text;
  final double initialAngle;
  final TextStyle textStyle;

  final _textPainter = TextPainter(textDirection: TextDirection.ltr);

  @override
  void paint(Canvas canvas, Size size) {
    canvas.translate(size.width / 2, size.height / 2 - radius);

    if (initialAngle != 0) {
      final d = 2 * radius * math.sin(initialAngle / 2);
      final rotationAngle = _calculateRotationAngle(0, initialAngle);
      canvas.rotate(rotationAngle);
      canvas.translate(d, 0);
    }

    double angle = initialAngle;
    for (int i = 0; i < text.length; i++) {
      angle = _drawLetter(canvas, text[i], angle);
    }
  }

  double _drawLetter(Canvas canvas, String letter, double prevAngle) {
    _textPainter.text = TextSpan(text: letter, style: textStyle);
    _textPainter.layout(
      minWidth: 0,
      maxWidth: double.maxFinite,
    );

    final double d = _textPainter.width;
    final double alpha = 2 * math.asin(d / (2 * radius));

    final newAngle = _calculateRotationAngle(prevAngle, alpha);
    canvas.rotate(newAngle);

    _textPainter.paint(canvas, Offset(0, -_textPainter.height));
    canvas.translate(d, 0);

    return alpha;
  }

  double _calculateRotationAngle(double prevAngle, double alpha) =>
      (alpha + prevAngle) / 2;

  @override
  bool shouldRepaint(CustomPainter oldDelegate) => true;
}