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