Flutter 中的圆波动画 Canvas - 图表
Circular wave animation in Flutter with Canvas - Charts
我正在尝试使用 Flutter 中的 Canvas 创建动画。我想做的动画是这样的:
示例:
我设法制作了一些动画,但 none 正是我所需要的。如果已经与 Canvas 合作过的人能以任何方式帮助我,我将不胜感激。
我需要使用 canvas 来实现这个结果的原因是因为我直接对负责生成图表的包进行更改。有图表包做类似的事情,但出于商业原因,我需要使用已经在使用的东西。
它被称为波纹动画,关键是使用 scaleTranstion
您可以将下面的代码更改为您想要的任何内容
class RipplesAnimation extends StatefulWidget {
const RipplesAnimation({Key key, this.size = 80.0, this.color = Colors.red,
this.onPressed, @required this.child,}) : super(key: key);
final double size;
final Color color;
final Widget child;
final VoidCallback onPressed;
@override
_RipplesAnimationState createState() => _RipplesAnimationState();
}
class _RipplesAnimationState extends State<RipplesAnimation> with TickerProviderStateMixin {
AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 2000),
vsync: this,
)..repeat();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
Widget _button() {
return Center(
child: ClipRRect(
borderRadius: BorderRadius.circular(widget.size),
child: DecoratedBox(
decoration: BoxDecoration(
gradient: RadialGradient(
colors: <Color>[
widget.color,
Color.lerp(widget.color, Colors.black, .05)
],
),
),
child: ScaleTransition(
scale: Tween(begin: 0.95, end: 1.0).animate(
CurvedAnimation(
parent: _controller,
curve: const CurveWave(),
),
),
child: Icon(Icons.speaker_phone, size: 44,)
),
),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Flutter Ripple Demo"),
),
body: Center(
child: CustomPaint(
painter: CirclePainter(
_controller,
color: widget.color,
),
child: SizedBox(
width: widget.size * 4.125,
height: widget.size * 4.125,
child: _button(),
),
),
),
);
}
}
使用 simple_ripple_animation 包:https://pub.dev/packages/simple_ripple_animation 在您的 code.it 中有一个简单且可自定义的动画小部件。
这是示例代码:
RippleAnimation(
repeat: true,
color: Colors.blue,
minRadius: 90,
ripplesCount: 6,
child: Container()
)
输出:Flutter output gif
我正在尝试使用 Flutter 中的 Canvas 创建动画。我想做的动画是这样的:
示例:
我设法制作了一些动画,但 none 正是我所需要的。如果已经与 Canvas 合作过的人能以任何方式帮助我,我将不胜感激。
我需要使用 canvas 来实现这个结果的原因是因为我直接对负责生成图表的包进行更改。有图表包做类似的事情,但出于商业原因,我需要使用已经在使用的东西。
它被称为波纹动画,关键是使用 scaleTranstion
您可以将下面的代码更改为您想要的任何内容
class RipplesAnimation extends StatefulWidget {
const RipplesAnimation({Key key, this.size = 80.0, this.color = Colors.red,
this.onPressed, @required this.child,}) : super(key: key);
final double size;
final Color color;
final Widget child;
final VoidCallback onPressed;
@override
_RipplesAnimationState createState() => _RipplesAnimationState();
}
class _RipplesAnimationState extends State<RipplesAnimation> with TickerProviderStateMixin {
AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 2000),
vsync: this,
)..repeat();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
Widget _button() {
return Center(
child: ClipRRect(
borderRadius: BorderRadius.circular(widget.size),
child: DecoratedBox(
decoration: BoxDecoration(
gradient: RadialGradient(
colors: <Color>[
widget.color,
Color.lerp(widget.color, Colors.black, .05)
],
),
),
child: ScaleTransition(
scale: Tween(begin: 0.95, end: 1.0).animate(
CurvedAnimation(
parent: _controller,
curve: const CurveWave(),
),
),
child: Icon(Icons.speaker_phone, size: 44,)
),
),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Flutter Ripple Demo"),
),
body: Center(
child: CustomPaint(
painter: CirclePainter(
_controller,
color: widget.color,
),
child: SizedBox(
width: widget.size * 4.125,
height: widget.size * 4.125,
child: _button(),
),
),
),
);
}
}
使用 simple_ripple_animation 包:https://pub.dev/packages/simple_ripple_animation 在您的 code.it 中有一个简单且可自定义的动画小部件。 这是示例代码:
RippleAnimation(
repeat: true,
color: Colors.blue,
minRadius: 90,
ripplesCount: 6,
child: Container()
)
输出:Flutter output gif