iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >AndroidFlutter实现仿闲鱼动画效果
  • 602
分享到

AndroidFlutter实现仿闲鱼动画效果

摘要

目录前言动效闲鱼动效仿写效果思路1、底部返回键旋转动画2、底部四个栏目变速上移动画+渐变动画3、中间图片渐变动画4、顶部文案渐变动画+下移动画5、注销动画前言 目前正在做的项目,为了

前言

目前正在做的项目,为了增加用户的体验度,准备增加一些动画效果,其中底部栏中间按钮的点击事件参考了闲鱼的动效,便在此基础上仿写了该动效,并增加了一些新的效果。

动效

闲鱼动效

仿写效果

思路

根据UI的设计图,对每个模块设计好动画效果,本人主要设计了以下四个效果。

1、底部返回键旋转动画

底部返回按钮动画其实就是个旋转动画,利用TransfORM.rotate设置angle的值即可,这里使用了GetX来对angle进行动态控制。

//返回键旋转角度,初始旋转45度,使其初始样式为 +
var angle = (pi / 4).obs;

///关闭按钮旋转动画控制器
late final AnimationController closeController;
late final Animation<double> closeAnimation;

///返回键旋转动画
closeController = AnimationController(
  duration: const Duration(milliseconds: 300),
  vsync: provider,
);

///返回键旋转动画
closeController = AnimationController(
  duration: const Duration(milliseconds: 300),
  vsync: provider,
);

///页面渲染完才开始执行,不然第一次打开不会启动动画
WidgetsBinding.instance.addPostFrameCallback((duration) {
  closeAnimation =
      Tween(begin: pi / 4, end: pi / 2).animate(closeController)
        ..addListener(() {
          angle.value = closeAnimation.value;
        });
  closeController.forward();
});


///关闭按钮点击事件
void close() {
  ///反转动画,并关闭页面
  Future.delayed(
     const Duration(milliseconds: 120), () {
    Get.back();
  });

  closeController.reverse();
}


IconButton(
    onPressed: null,
    alignment: Alignment.center,
    icon: Transform.rotate(
      angle: controller.angle.value,
      child: SvgPicture.asset(
        "assets/user/ic-train-car-close.svg",
        width: 18,
        height: 18,
        color: Colors.black,
      ),
    ))

2、底部四个栏目变速上移动画+渐变动画

四个栏目其实就是个平移动画,只不过闲鱼是四个栏目一起平移,而我选择了变速平移,这样视觉效果上会好一点。

//透明度变化
List<AnimationController> opacityControllerList = [];
//上移动画,由于每个栏目的移动速度不一样,需要用List保存四个AnimationController,
//如果想像闲鱼那种整体上移,则只用一个AnimationController即可。
List<AnimationController> offsetControllerList = [];
List<Animation<Offset>> offsetAnimationList = [];

//之所以用addIf,是因为项目中这几个栏目的显示是动态显示的,这里就直接写成true
Column(
    children: []
      ..addIf(
          true,
          buildItem('assets/user/ic-train-nomal-car.WEBp',"学车加练","自主预约,快速拿证"))
      ..addIf(
          true,
          buildItem('assets/user/ic-train-fuuxn-car.webp',"有证复训","优质陪练,轻松驾车"))
      ..addIf(
          true,
          buildItem('assets/user/ic-train-jiaxun-car.webp',"模拟加训","考前加训,临考不惧"))
      ..addIf(
          true,
          buildItem('assets/user/ic-train-jiakao-car.webp',"驾考报名","快捷报名无门槛"))
      ..add(playWidget())
      ..addAll([
        17.space,
      ]),
   )
      
//仅仅是为了在offsetController全部初始化完后执行play()
Widget playWidget() {
  //执行动画
  play();
  return Container();
}

int i = 0;

Widget buildItem(String img,String tab,String slogan) {
  //由于底部栏目是动态显示的,需要在创建Widget时一同创建offsetController和offsetAnimation
  i++;
  AnimationController offsetController = AnimationController(
    duration: Duration(milliseconds: 100 + i * 20),
    vsync: this,
  );
  Animation<Offset> offsetAnimation = Tween<Offset>(
    begin: const Offset(0, 2.5),
    end: const Offset(0, 0),
  ).animate(CurvedAnimation(
    parent: offsetController,
    // curve: Curves.easeInOutSine,
    curve: const Cubic(0.12, 0.28, 0.48, 1),
  ));

  AnimationController opacityController = AnimationController(
      duration: const Duration(milliseconds: 500),
      lowerBound: 0.2,
      upperBound: 1.0,
      vsync: this);

  opacityControllerList.add(opacityController);
  offsetControllerList.add(offsetController);
  offsetAnimationList.add(offsetAnimation);

  return SlideTransition(
    position: offsetAnimation,
    child: FadeTransition(
        opacity: opacityController,
        child: Container(
            margin: EdgeInsets.only(bottom: 16),
            height: 62,
            decoration: BoxDecoration(
                borderRadius: BorderRadius.all(Radius.circular(12)),
                color: const Color(0xfffafafa)),
            child:
            Row(mainAxisAlignment: MainAxisAlignment.center, children: [
              24.space,
              Image.asset(img, width: 44, height: 44),
              12.space,
              Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    Text(tab,
                        style: const TextStyle(
                            color: Color(0XFF000000),
                            fontSize: 16,
                            fontWeight: FontWeight.bold)),
                    Text(slogan,
                        style: const TextStyle(
                            color: Color(0XFF6e6e6e), fontSize: 12)),
                  ]).expanded,
              Image.asset("assets/user/ic-train-arrow.webp",
                  width: 44, height: 44),
              17.space
            ])).inkWell(
            onTap: () {},
            delayMilliseconds: 50)),
  );
}

//执行动画
void play() async {
  for (int i = 0; i < offsetControllerList.length; i++) {
    opacityControllerList[i].forward();

    ///栏目正序依次延迟(40 + 2 * i) * i的时间,曲线速率
    Future.delayed(Duration(milliseconds: (40 + 2 * i) * i), () {
      offsetControllerList[i]
          .forward()
          .whenComplete(() => offsetControllerList[i].stop());
    });
  }
}



///关闭按钮点击事件
void close() {
  ///反转动画,并关闭页面
  Future.delayed(
     const Duration(milliseconds: 120), () {
    Get.back();
  });

  for (int i = offsetControllerList.length - 1; i >= 0; i--) {
    ///栏目倒叙依次延迟(40 + 2 * (offsetControllerList.length-1-i)) * (offsetControllerList.length-1-i))的时间
    Future.delayed(
        Duration(
            milliseconds:
            (40 + 2 * (offsetControllerList.length-1-i)) * (offsetControllerList.length-1-i)), () {
      offsetControllerList[i].reverse();
    });
  }
  opacityTopController.reverse();
}

3、中间图片渐变动画

渐变动画使用FadeTransition即可。

///图片透明度渐变动画控制器
late final AnimationController imGController;

///图片透明度渐变动画
imgController = AnimationController(
    duration: const Duration(milliseconds: 500),
    lowerBound: 0.0,
    upperBound: 1.0,
    vsync: provider);
imgController.forward().whenComplete(() => imgController.stop());

///渐变过渡
FadeTransition(
  opacity: imgController,
  child:
  Image.asset("assets/user/ic-traincar-guide.webp"),
),

///关闭按钮点击事件
void close() {
  imgController.reverse();
}

4、顶部文案渐变动画+下移动画

///顶部标题下移动画控制器
late final AnimationController offsetTopController;
late final Animation<Offset> offsetTopAnimation;

///顶部标题渐变动画控制器
late final AnimationController opacityTopController;


///顶部标题上移动画
offsetTopController = AnimationController(
  duration: const Duration(milliseconds: 300),
  vsync: provider,
);
offsetTopController
    .forward()
    .whenComplete(() => offsetTopController.stop());
offsetTopAnimation = Tween<Offset>(
  begin: const Offset(0, -0.8),
  end: const Offset(0, 0),
).animate(CurvedAnimation(
  parent: offsetTopController,
  curve: Curves.easeInOutCubic,
));
offsetTopController
    .forward()
    .whenComplete(() => offsetTopController.stop());
    
//UI
SlideTransition(
    position: offsetTopAnimation,
    child: FadeTransition(
        opacity: opacityTopController,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          mainAxisAlignment: MainAxisAlignment.start,
          mainAxisSize: MainAxisSize.min,
          children: [
            80.space,
            const Text(
              '练车指南',
              style: TextStyle(
                color: Color(0XFF141414),
                fontSize: 32,
                fontWeight: FontWeight.w800,
              ),
            ),
            2.space,
            const Text('易练只为您提供优质教练,为您的安全保驾护航',
                style: TextStyle(
                    color: Color(0XFF141414),
                    fontSize: 15)),
          ],
        ))),
        

///关闭按钮点击事件
void close() {
  offsetTopController.reverse();
  opacityTopController.reverse();

}

5、注销动画

最后,在关闭页面的时候不要忘记注销动画。

///关闭时注销动画
void dispose() {
  for (int i = offsetControllerList.length - 1; i > 0; i--) {
    offsetControllerList[i].dispose();
  }
  offsetTopController.dispose();
  opacityTopController.dispose();
  imgController.dispose();
  closeController.dispose();
}

以上就是Android Flutter实现仿闲鱼动画效果的详细内容,更多关于Android Flutter仿闲鱼动画的资料请关注编程网其它相关文章!

--结束END--

本文标题: AndroidFlutter实现仿闲鱼动画效果

本文链接: https://www.lsjlt.com/news/197305.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • AndroidFlutter实现仿闲鱼动画效果
    目录前言动效闲鱼动效仿写效果思路1、底部返回键旋转动画2、底部四个栏目变速上移动画+渐变动画3、中间图片渐变动画4、顶部文案渐变动画+下移动画5、注销动画前言 目前正在做的项目,为了...
    99+
    2023-02-23
    Android Flutter仿闲鱼动画 Android仿闲鱼动画 Android Flutter动画
  • Android Flutter怎么实现仿闲鱼动画效果
    这篇文章主要讲解了“Android Flutter怎么实现仿闲鱼动画效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android Flutter怎么实现仿闲鱼动画效果...
    99+
    2023-07-05
  • AndroidFlutter实现3D动画效果示例详解
    目录前言AnimatedWidget 简介3D 旋转动画的实现总结前言 上一篇我们介绍了 Animation 和 AnimationController...
    99+
    2024-04-02
  • AndroidFlutter实现GIF动画效果的方法详解
    目录前言交错动画机制代码实现Interval 介绍总结前言 我们之前介绍了不少有关动画的篇章。前面介绍的动画都是只有一个动画效果,那如果我们想对某个组件实现一组动效,比如下面的效果,...
    99+
    2024-04-02
  • AndroidFlutter实现五种酷炫文字动画效果详解
    目录前言波浪涌动效果波浪线跳动文字组彩虹动效滚动广告牌效果打字效果其他效果自定义效果总结前言 偶然逛国外博客,看到了一个介绍文字动画的库,进入 pub 一看,立马就爱上这个动画库了,...
    99+
    2024-04-02
  • Android实现仿微软系统加载动画效果
    目录效果图:实现步骤:具体代码实现:1、创建Circle对象2、自定义MinSoftLoadingView实现代码3、布局文件中使用效果图: 实现步骤: 初始化五个圆球分...
    99+
    2024-04-02
  • AndroidFlutter实现弹幕效果
    目录前言通用弹幕实现方案ListView弹幕方案实现基本框架轮播滚动轮询算法点击事件前言 需求要点如下: 弹幕行数为3行,每条弹幕相互依靠但不存在重叠每条弹幕可交互点击跳转滚动速度恒...
    99+
    2024-04-02
  • Android实现仿iOS菊花加载圈动画效果
    目录常见的实现方式效果图:完整代码布局代码 常见的实现方式 切图,做旋转动画 自定义View,绘制效果 gif图 1、切图会增加体积,但相对简单,不过在换...
    99+
    2024-04-02
  • AndroidFlutter实现图片滑动切换效果
    目录前言SlideTransition 介绍示例效果实现总结前言 我们开始来介绍转换类的动画组件,实际上这类转换动画组件也可以自己通过 AnimatedBuilder&nb...
    99+
    2024-04-02
  • Android实现仿今日头条点赞动画效果实例
    目录一、前言二、需求拆分三、实现方案1、点赞控件触摸事件处理2、点赞动画的实现2.1、点赞效果图片的获取和存储管理2.2、点赞表情图标动画实现2.3、点赞次数和点赞文案的绘制3、存放...
    99+
    2024-04-02
  • WPF实现动画效果
    学习平台 微软开发者博客:https://devblogs.microsoft.com/WT.mc_id=DT-MVP-5003986微软文档与学习:https://docs.mic...
    99+
    2024-04-02
  • Android如何实现仿iOS菊花加载圈动画效果
    这篇文章主要介绍了Android如何实现仿iOS菊花加载圈动画效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。常见的实现方式切图,做旋转动画自定义View,绘制效果gif图...
    99+
    2023-06-15
  • javascript实现缓动动画效果
    本文实例为大家分享了javascript实现缓动动画效果的具体代码,供大家参考,具体内容如下 实现思路 1、主要使用setInterval定时函数 2、给需要动画的元素添加绝对定位和...
    99+
    2024-04-02
  • WPF实现动画效果(六)之路径动画
    WPF动画效果系列 WPF实现动画效果(一)之基本概念 WPF实现动画效果(二)之From/To/By 动画 WPF实现动画效果(三)之时间线(TimeLine) WPF实现动画效果...
    99+
    2024-04-02
  • jQuery如何实现动画效果?
    ...
    99+
    2024-04-02
  • 如何实现css3动画效果
    这篇文章主要介绍“如何实现css3动画效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何实现css3动画效果”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • 用JavaScript实现动画效果(转)
    大家在使用Dreamweaver中的时间线功能或以做出很有趣的动画效果,Dreamweaver会自动为用户生成特定的程序代码,大家有没有想过动画的实现原理呢?其实原理是很简单的,主要是使用了一个计时器函数,下面我为大家  演示一个简单的动画...
    99+
    2023-06-03
  • 用JavaScript实现动画效果 (转)
    用JavaScript实现动画效果 (转)[@more@]主页: .NET">http://www.maxss.netEMail: maxss.net@163.com  大家在使用Dreamweaver中的时间线功能或以做出很有趣的动画效果...
    99+
    2023-06-03
  • Vue如何实现动画效果
    这篇文章主要介绍Vue如何实现动画效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:1.哪些元素/那些组件适合在那些条件下实现动画效果条件渲染 (使用 v-if)条件展示 ...
    99+
    2024-04-02
  • javascript实现匀速动画效果
    本文实例为大家分享了javascript实现匀速动画的具体代码,供大家参考,具体内容如下 实现思路: 1、主要使用定时函数setInterval()来实现动画效果 2、可以将动画封装...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作