- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 Widget,可以为公交车站构建圆形个人资料图片,现在它在个人资料图片周围有一个圆形边框,就像这样。我想将圆形边框更改为虚线,并通过以虚线形式围绕个人资料图片盘旋/旋转来设置动画。有没有简单的方法可以做到这一点?非常感谢您提供的任何帮助!
return new Transform(
transform: new Matrix4.diagonal3Values(
animation.avatarSize.value,
animation.avatarSize.value,
1.0,
),
alignment: Alignment.center,
child: new Container(
width: 110.0,
height: 110.0,
decoration: new BoxDecoration(
shape: BoxShape.circle,
border: new Border.all(
color: Colors.white30,
),
),
margin: const EdgeInsets.only(
top: 24.0,
left: 16.0,
),
padding: const EdgeInsets.all(3.0),
child: new ClipOval(
child: new Image.asset(
stopName.avatar,
),
),
),
);
最佳答案
不幸的是,简单的答案是没有简单的方法来做到这一点。 Flutter 的人们以其无穷的智慧得出结论,虚线的性能不足以包含在 Flutter 中,因此没有人需要绘制虚线。 (是的,这句话中的逻辑不连续性是有意的。不要误会我的意思——我喜欢 flutter,开发人员做得很好,但他们似乎确实根据性能而不是功能做出了一些半武断的决定).
我所看到的解释是,基本上 C++ 版本会做类似于 dart 代码的事情(除非它直接在 GPU 上完成),因此他们希望有人最终在 dart 中实现虚线(可能是图书馆的一部分?)。参见 this github bug进步和讨论......如果你想在未来看到破折号,+1。如果有足够多的人这样做,那么最终 flutter 的人可能会决定实现它。
但就目前而言,这意味着没有简单的方法来制作带有虚线的 CircleBorder 或任何其他类型的边框。
但是,通过最大的努力,您想要的完全可以实现 =)。下面是为您快速截取的代码,可以满足您的需求。请注意 - 它不是很优化,可能有更简单的方法可以做到这一点,您可以使用 Decoration 并在那里实现绘画等......但这确实有效。
import 'dart:math';
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: new SafeArea(
child: Column(
children: [
new DashedCircle(
child: new ClippedDrawing(),
)
],
),
),
);
}
}
class ClippedDrawing extends StatelessWidget {
@override
Widget build(BuildContext context) => new ClipOval(
child: new Container(
color: Colors.red,
),
);
}
class DashedCircle extends StatefulWidget {
final Widget child;
const DashedCircle({Key key, this.child}) : super(key: key);
@override
DashedBorderState createState() => new DashedBorderState();
}
class DashedBorderState extends State<DashedCircle> with TickerProviderStateMixin<DashedCircle> {
AnimationController controller;
Animation<double> animation;
@override
void initState() {
super.initState();
controller = new AnimationController(vsync: this, duration: Duration(seconds: 10));
animation = new Tween(begin: 0.0, end: pi * 2.0).animate(controller);
controller.repeat();
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: animation,
builder: (context, child) {
return new CustomPaint(
painter: OvalPainter(
color: Colors.blue, borderWidth: 1.0, dashLength: 5.0, spaceLength: 2.0, offset: animation.value),
child: child,
);
},
child: Container(
width: 110.0,
height: 110.0,
padding: EdgeInsets.all(3.0),
child: widget.child,
),
);
}
}
class OvalPainter extends CustomPainter {
final Color color;
final double borderWidth;
final double dashLength;
final double spaceLength;
final double offset;
OvalPainter(
{@required this.borderWidth,
@required this.dashLength,
@required this.spaceLength,
@required this.offset,
@required this.color});
double lastShortestSide;
double lastDashLength;
double lastSpaceLength;
Path lastPath;
@override
void paint(Canvas canvas, Size size) {
Rect rect = Offset.zero & size;
var radius = rect.shortestSide / 2;
canvas.translate(radius, radius);
canvas.rotate(offset);
Path path;
if (lastShortestSide == rect.shortestSide &&
dashLength == lastDashLength &&
spaceLength == lastSpaceLength &&
lastPath != null) {
path = lastPath;
} else {
path = _getDashedCircularPath(rect.shortestSide / 2, dashLength, spaceLength);
lastPath = path;
lastShortestSide = rect.shortestSide;
lastDashLength = dashLength;
lastSpaceLength = spaceLength;
}
canvas.drawPath(
path,
new Paint()
..style = PaintingStyle.stroke
..color = color
..strokeWidth = borderWidth,
);
}
@override
bool shouldRepaint(OvalPainter oldDelegate) {
return offset != oldDelegate.offset ||
color != oldDelegate.color ||
borderWidth != oldDelegate.borderWidth ||
dashLength != oldDelegate.dashLength ||
spaceLength != oldDelegate.spaceLength;
}
static Path _getDashedCircularPathFromNumber(double radius, int numSections, double dashPercentage) {
var tau = 2 * pi;
var actualTotalLength = tau / numSections;
var actualDashLength = actualTotalLength * dashPercentage;
double offset = 0.0;
Rect rect = new Rect.fromCircle(center: Offset.zero, radius: radius);
Path path = new Path();
for (int i = 0; i < numSections; ++i) {
path.arcTo(rect, offset, actualDashLength, true);
offset += actualTotalLength;
}
return path;
}
static Path _getDashedCircularPath(double radius, double dashLength, double spaceLength) {
// first, find number of radians that dashlength + spacelength take
var tau = 2 * pi;
var circumference = radius * tau;
var dashSpaceLength = dashLength + spaceLength;
var num = circumference / (dashSpaceLength);
// we'll floor the value so that it's close-ish to the same amount as requested but
// instead will be the same all around
var closeNum = num.floor();
return _getDashedCircularPathFromNumber(radius, closeNum, dashLength / dashSpaceLength);
}
}
关于dart - 如何在 Flutter 中为 Container 小部件自定义/旋转 BoxDecoration?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51160107/
我喜欢 FadeInImage 我可以做这个 child: FadeInImage.assetNetwork( image: 'https://placeimg.com/640/480/any
我喜欢 FadeInImage 我能做到 child: FadeInImage.assetNetwork( image: 'https://placeimg.com/640/480/any',
我想将以下容器添加到 ListView,但该容器没有将添加的图像大小作为装饰。如果我将图像添加为容器的子项,它工作正常,但我也想在图像顶部显示文本。 var imageListView = new L
我想创建一个像 CircleAvatar 这样的小部件,当它溢出时会剪辑它的 child (CircleAvatar 只剪辑图像,而不是它的 child )。我可以强制 BoxDecoration 剪
我知道 ClipRRect 有额外的选项,比如自定义剪辑器。但是如果我只需要一个简单的边界半径,会有什么性能差异吗?哪个比较推荐? 最佳答案 如果您的目标是创建圆形边框,则必须仅在最后一种情况下使用剪
我有以下代码片段,我想让图像褪色,这样它就不会干扰容器中的其他项目。有没有过滤器可以做到这一点? child: new Card( child: new Container( decora
我试图在 TabBar 中实现边距,但我没有找到任何东西。所以我的想法是在indicator参数中对TabBar的BoxDecoration做一个margin。 这就是我想要的: 这是我的: 我的实现
我想在 BoxDecoration 中显示网络的图像。但它显示错误 "The argument type 'image' can't be assigned to the parameter type
我有一个 Flutter Container 小部件,我为它定义了一种颜色(粉红色),但由于某种原因,BoxDecoration 中的颜色覆盖了它(绿色)。为什么? new Container(
我有一个 Widget,可以为公交车站构建圆形个人资料图片,现在它在个人资料图片周围有一个圆形边框,就像这样。我想将圆形边框更改为虚线,并通过以虚线形式围绕个人资料图片盘旋/旋转来设置动画。有没有简单
我是一名优秀的程序员,十分优秀!