mirror of
https://github.com/supanadit/geo-smart-app.git
synced 2024-11-22 10:06:25 +00:00
172 lines
4.4 KiB
Dart
172 lines
4.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'dart:math';
|
|
|
|
enum DotType { square, circle, diamond, icon }
|
|
|
|
class Loader extends StatefulWidget {
|
|
final Color dotOneColor;
|
|
final Color dotTwoColor;
|
|
final Color dotThreeColor;
|
|
final Duration duration;
|
|
final DotType dotType;
|
|
final Icon dotIcon;
|
|
|
|
Loader(
|
|
{this.dotOneColor = Colors.redAccent,
|
|
this.dotTwoColor = Colors.green,
|
|
this.dotThreeColor = Colors.blueAccent,
|
|
this.duration = const Duration(milliseconds: 1000),
|
|
this.dotType = DotType.circle,
|
|
this.dotIcon = const Icon(Icons.blur_on)});
|
|
|
|
@override
|
|
_LoaderState createState() => _LoaderState();
|
|
}
|
|
|
|
class _LoaderState extends State<Loader> with SingleTickerProviderStateMixin {
|
|
Animation<double> animation_1;
|
|
Animation<double> animation_2;
|
|
Animation<double> animation_3;
|
|
AnimationController controller;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
controller = AnimationController(duration: widget.duration, vsync: this);
|
|
|
|
animation_1 = Tween(begin: 0.0, end: 1.0).animate(
|
|
CurvedAnimation(
|
|
parent: controller,
|
|
curve: Interval(0.0, 0.80, curve: Curves.ease),
|
|
),
|
|
);
|
|
|
|
animation_2 = Tween(begin: 0.0, end: 1.0).animate(
|
|
CurvedAnimation(
|
|
parent: controller,
|
|
curve: Interval(0.1, 0.9, curve: Curves.ease),
|
|
),
|
|
);
|
|
|
|
animation_3 = Tween(begin: 0.0, end: 1.0).animate(
|
|
CurvedAnimation(
|
|
parent: controller,
|
|
curve: Interval(0.2, 1.0, curve: Curves.ease),
|
|
),
|
|
);
|
|
|
|
controller.addListener(() {
|
|
setState(() {
|
|
//print(animation_1.value);
|
|
});
|
|
});
|
|
|
|
controller.repeat();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
child: new Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: <Widget>[
|
|
new Transform.translate(
|
|
offset: Offset(
|
|
0.0,
|
|
-30 *
|
|
(animation_1.value <= 0.50
|
|
? animation_1.value
|
|
: 1.0 - animation_1.value),
|
|
),
|
|
child: new Padding(
|
|
padding: const EdgeInsets.only(right: 8.0),
|
|
child: Dot(
|
|
radius: 10.0,
|
|
color: widget.dotOneColor,
|
|
type: widget.dotType,
|
|
icon: widget.dotIcon,
|
|
),
|
|
),
|
|
),
|
|
Transform.translate(
|
|
offset: Offset(
|
|
0.0,
|
|
-30 *
|
|
(animation_2.value <= 0.50
|
|
? animation_2.value
|
|
: 1.0 - animation_2.value),
|
|
),
|
|
child: new Padding(
|
|
padding: const EdgeInsets.only(right: 8.0),
|
|
child: Dot(
|
|
radius: 10.0,
|
|
color: widget.dotTwoColor,
|
|
type: widget.dotType,
|
|
icon: widget.dotIcon,
|
|
),
|
|
),
|
|
),
|
|
Transform.translate(
|
|
offset: Offset(
|
|
0.0,
|
|
-30 *
|
|
(animation_3.value <= 0.50
|
|
? animation_3.value
|
|
: 1.0 - animation_3.value),
|
|
),
|
|
child: new Padding(
|
|
padding: const EdgeInsets.only(right: 8.0),
|
|
child: Dot(
|
|
radius: 10.0,
|
|
color: widget.dotThreeColor,
|
|
type: widget.dotType,
|
|
icon: widget.dotIcon,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
controller.dispose();
|
|
super.dispose();
|
|
}
|
|
}
|
|
|
|
class Dot extends StatelessWidget {
|
|
final double radius;
|
|
final Color color;
|
|
final DotType type;
|
|
final Icon icon;
|
|
|
|
Dot({this.radius, this.color, this.type, this.icon});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return new Center(
|
|
child: type == DotType.icon
|
|
? Icon(
|
|
icon.icon,
|
|
color: color,
|
|
size: 1.3 * radius,
|
|
)
|
|
: new Transform.rotate(
|
|
angle: type == DotType.diamond ? pi / 4 : 0.0,
|
|
child: Container(
|
|
width: radius,
|
|
height: radius,
|
|
decoration: BoxDecoration(
|
|
color: color,
|
|
shape: type == DotType.circle
|
|
? BoxShape.circle
|
|
: BoxShape.rectangle),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|