微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter案例-点赞动画

效果

按下缩小,松开恢复原状并变色

 

原理:

使用animation动画和三元运算

所有代码如下:

import 'package:Flutter/material.dart';
import 'package:async/async.dart';
void main()=>runApp(MyApp());

class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // Todo: implement build
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("点赞动画"),
        ),
        body: LikeAnimationWidget(),
      ),
    );
  }
}
class LikeAnimationWidget extends StatefulWidget{
  @override
  _LikeAnimationWidgetState createState() {
    // Todo: implement createState
    return _LikeAnimationWidgetState();
  }
}
class _LikeAnimationWidgetState extends State<LikeAnimationWidget> with TickerProviderStateMixin{
  AnimationController controller;
  CurvedAnimation curve;
  Animation animationSize;
  double size=25.0;
  @override
  void initState() {
    // Todo: implement initState
    super.initState();
    controller=AnimationController(vsync: this,duration: Duration(milliseconds: 150));
    curve=CurvedAnimation(parent: controller,curve: Curves.easeInCirc);
    animationSize=Tween(begin: 40.0,end: 35.0,).animate(controller);
  }

  @override
  Widget build(BuildContext context) {
    // Todo: implement build
    return Center(
      child: LikeAnimation(
        controller: controller,
        list: [
          animationSize,
        ],
      ),
    );
  }
}

class LikeAnimation extends AnimatedWidget implements StatefulWidget{
  AnimationController controller;
  List<Animation> list;
  bool color=false;
  LikeAnimation({
    this.controller, this.list
}):super(listenable:controller);

  @override
  Widget build(BuildContext context) {
    // Todo: implement build
    return GestureDetector(
      child: Icon(
        Icons.favorite,
        size: list[0].value,
        color: color?Colors.red:Colors.grey,
      ),
        onTapDown: (DragDownDetails){
          controller.forward();
        },
        onTapUp: (DragDownDetails){
          if(!color){
            new Future.delayed(Duration(milliseconds: 100),(){
              controller.reverse();
              color=true;
            });
            return;
          }
          new Future.delayed(Duration(milliseconds: 100),(){
            controller.reverse();
            color=false;
          });
          return;
        },
    );
  }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐