【发布时间】:2019-04-24 18:31:44
【问题描述】:
【问题讨论】:
【问题讨论】:
正如 Arnold Parge 所说,您可以使用 GestureDetector 并收听 onTapDown 和 onTapUp。要创建所需的 LoadingButton,您可以使用以下 Widget 结构:
- GetureDetector
- Stack
- CircularProgressIndicator // background circle
- CircularProgressIndicator // foreground circle
- Icon
要创建动画,您可以添加AnimationController 并将前景CircularProgressIndicator 的值绑定到AnimationController.value。现在您只需将两个侦听器添加到GestureDetector:
onTapDown:点击按钮时,动画应该开始。因此我们调用AnimationController.forward()
onTapUp: 释放新闻时,我们想检查动画是否已经完成。我们可以使用AnimationController.status 来检查状态。如果是AnimationStatus.forward,它仍在运行。因此我们想通过调用AnimationController.reverse()来反转动画。这是生成的按钮:
以及完整源代码:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(),
home: Scaffold(
body: Center(child: LoadingButton()),
),
);
}
}
class LoadingButton extends StatefulWidget {
@override
LoadingButtonState createState() => LoadingButtonState();
}
class LoadingButtonState extends State<LoadingButton>
with SingleTickerProviderStateMixin {
AnimationController controller;
@override
void initState() {
super.initState();
controller =
AnimationController(vsync: this, duration: Duration(seconds: 1));
controller.addListener(() {
setState(() {});
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTapDown: (_) => controller.forward(),
onTapUp: (_) {
if (controller.status == AnimationStatus.forward) {
controller.reverse();
}
},
child: Stack(
alignment: Alignment.center,
children: <Widget>[
CircularProgressIndicator(
value: 1.0,
valueColor: AlwaysStoppedAnimation<Color>(Colors.grey),
),
CircularProgressIndicator(
value: controller.value,
valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
),
Icon(Icons.add)
],
),
);
}
}
【讨论】:
onTapDown 处理程序添加条件。如果我没有正确回答您的问题,您介意具体说明您真正需要什么吗? :)
在onTapDown开始进度,如果进度不完整或者你的条件是什么,在onTapUp反转进度。
【讨论】: