- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试在 Flutter 中制作一个径向菜单,并希望我的菜单按钮在每次按下时都有一个旋转动画。我遵循了 TensorProgramming 在 Youtube 上关于 Flutter 动画基础知识的教程,但由于某种原因我的动画不起作用。下面我包含了我的 RadialMenuWidget 的代码。
我已经正确处理了动画 Controller ,使用 SingleTickerProviderStateMixin 扩展了小部件的状态。 P.S 我在模拟器上运行,当我热重载时,图标的旋转有时会发生变化。
如有任何帮助,我们将不胜感激!
import 'package:flutter/material.dart';
import 'package:savings/utils/colors.dart';
import 'package:savings/widgets/themed_radial_menu_item.dart';
class CustomThemedRadialMenu extends StatefulWidget {
final List<CustomThemedRadialMenuItem> items;
CustomThemedRadialMenu({@required this.items});
@override
_CustomThemedRadialMenuState createState() =>
_CustomThemedRadialMenuState();
}
class _CustomThemedRadialMenuState extends State<CustomThemedRadialMenu>
with SingleTickerProviderStateMixin {
Animation animationOpenClose;
AnimationController animationControllerOpenClose;
bool isOpen;
@override
void initState() {
isOpen = false;
animationControllerOpenClose =
AnimationController(duration: new Duration(seconds: 5), vsync: this);
animationOpenClose =
Tween(begin: 0.0, end: 360.0).animate(animationControllerOpenClose)
..addListener(() {
setState(() {});
});
animationControllerOpenClose.repeat();
super.initState();
}
@override
Widget build(BuildContext context) {
///A list of the items and the center menu button
final List<Widget> menuContents = <Widget>[];
for (int i = 0; i < widget.items.length; i++) {
///Menu items
menuContents.add(widget.items[1]);
///Menu Close/Open button
menuContents.add(new InkWell(
onTap: () {},
child: Container(
padding: new EdgeInsets.all(10.0),
decoration: new BoxDecoration(
color: Colors.white,
border: new Border.all(color: darkHeadingsTextColor),
shape: BoxShape.circle,
),
child: new Transform.rotate(
angle: animationControllerOpenClose.value,
child: isOpen ? new Icon(Icons.clear) : new Icon(Icons.menu)),
),
));
}
return new Stack(
alignment: Alignment.center,
children: menuContents,
);
}
@override
void dispose() {
animationControllerOpenClose.dispose();
super.dispose();
}
closeMenu() {
animationControllerOpenClose.forward();
setState(() {
isOpen = false;
});
print("RadialMenu Closed");
}
openMenu() {
animationControllerOpenClose.forward();
setState(() {
isOpen = true;
});
print("RadialMenu Opened");
}
}
最佳答案
您的操作存在一些问题。但是一个快速的 FYI - 如果你清理你的代码并提出一个封装的问题,人们更有可能帮助你。这将需要删除任何未包含的类,并理想地发布一个可以粘贴到单个文件中并按原样运行的解决方案。
话虽如此,我已经实现了我认为您正在尝试做的事情。我已经删除了一些你在那里拥有的东西,以便它实际构建,所以你需要将它们重新添加进去。
您遇到的主要问题如下:
在监听器中设置状态
..addListener(() {
setState(() {});
});
这并不理想,因为它会强制整个小部件重建动画的每个滴答声。对于不是很基本的小部件,这将导致严重的性能问题。请改用 AnimatedBuilder
。或者,如果您正在寻找动画何时结束,请使用 ..addStateListener
角度在 flutter 中以弧度为单位。我没有费心为 Pi 常数导入 Math,但你可能应该这样做。
您有一个实际上并没有调用 openMenu
或 closeMenu
的 on-tap,所以它肯定不会做任何事情 =D。
您可以将动画 Controller 设置为重复。这意味着它将永远持续下去。
您没有将任何内容传递给 animationControllerOpenClose.forward
调用。这意味着它将从当前所在的任何地方动画到 1.0 状态,即使那已经是 1.0。我刚刚传入了 0,但您可能想要围绕打开/关闭做一些事情(如果用户在动画或其他情况下点击)。
(切线问题)您似乎在每个菜单小部件之后添加了一个新的菜单打开/关闭按钮。这可能是您想要做的,但我猜您只想添加一个。
无论如何,这是有效的示例。每次点击时,它都会更改图标,然后旋转。
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Spinnig Menu",
theme: ThemeData(
primaryColor: Colors.red,
),
home: new Scaffold(
body: new SafeArea(
child: new Column(
children: <Widget>[new CustomThemedRadialMenu()],
),
),
),
);
}
}
class CustomThemedRadialMenu extends StatefulWidget {
@override
_CustomThemedRadialMenuState createState() => _CustomThemedRadialMenuState();
}
class _CustomThemedRadialMenuState extends State<CustomThemedRadialMenu> with SingleTickerProviderStateMixin {
Animation animationOpenClose;
AnimationController animationControllerOpenClose;
bool isOpen;
@override
void initState() {
isOpen = false;
animationControllerOpenClose = AnimationController(duration: new Duration(seconds: 5), vsync: this);
animationOpenClose = Tween(begin: 0.0, end: 3.14159 * 2).animate(animationControllerOpenClose);
super.initState();
}
@override
Widget build(BuildContext context) {
///A list of the items and the center menu button
final List<Widget> menuContents = <Widget>[];
///Menu Close/Open button
menuContents.add(new InkWell(
onTap: () {
if (isOpen) {
closeMenu();
} else {
openMenu();
}
},
child: Container(
padding: new EdgeInsets.all(10.0),
decoration: new BoxDecoration(
color: Colors.white,
border: new Border.all(color: Colors.black38),
shape: BoxShape.circle,
),
child: new AnimatedBuilder(
animation: animationControllerOpenClose,
builder: (context, child) {
return new Transform.rotate(angle: animationOpenClose.value, child: child);
},
child: isOpen ? new Icon(Icons.clear) : new Icon(Icons.menu),
)),
));
return new Stack(
alignment: Alignment.center,
children: menuContents,
);
}
@override
void dispose() {
animationControllerOpenClose.dispose();
super.dispose();
}
closeMenu() {
animationControllerOpenClose.forward(from: 0.0);
setState(() {
isOpen = false;
});
print("RadialMenu Closed");
}
openMenu() {
animationControllerOpenClose.forward(from: 0.0);
setState(() {
isOpen = true;
});
print("RadialMenu Opened");
}
}
值得注意的是,我在 AnimatedBuilder 的构建函数中构建了尽可能少的小部件。在那里构建的越少,性能越好。因为图标本身不会随着旋转的一部分而改变,所以您可以简单地将其作为子项传递。
我猜这可能会在接下来出现,所以仅供引用 - 您可以使用动画交叉淡入淡出小部件在图标之间进行转换(只需将其放入 AnimatedBuilder 的子项中):
new AnimatedCrossFade(
firstChild: new Icon(Icons.clear),
secondChild: new Icon(Icons.menu),
crossFadeState: isOpen ? CrossFadeState.showFirst : CrossFadeState.showSecond,
duration: Duration(milliseconds: 300)),
关于dart - flutter 动画不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50743794/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!