iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android Flutter怎么在点击事件上添加动画效果
  • 389
分享到

Android Flutter怎么在点击事件上添加动画效果

2023-07-05 16:07:19 389人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“Android Flutter怎么在点击事件上添加动画效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android Flutter怎么在点击事件上添加动画效果”文章能帮助大家解决疑惑,下面跟

本文小编为大家详细介绍“Android Flutter怎么在点击事件上添加动画效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android Flutter怎么在点击事件上添加动画效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

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,是因为项目中这几个栏目的显示是动态显示的,这里就直接写成trueColumn(    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());     //UISlideTransition(    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怎么在点击事件上添加动画效果”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Android Flutter怎么在点击事件上添加动画效果

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

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

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

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

下载Word文档
猜你喜欢
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-14
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-14
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-14
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-14
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-14
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-14
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-14
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-14
    golang 数据库备份 mysql git 标准库
  • 如何在 Golang 中优雅地处理错误?
    在 go 中,优雅处理错误包括:使用 error 类型;使用 errors 包函数和类型;自定义错误类型;遵循错误处理模式,包括关闭资源、检查错误、打印错误信息和处理或返回错误。 在 ...
    99+
    2024-05-14
    golang 错误处理
  • 如何构建 Golang RESTful API,并使用中间件进行身份验证?
    本文介绍了如何构建 golang restful api。首先,通过导入必要的库、定义数据模型和创建路由来构建 restful api。其次,使用 go-chi/chigot 和 go-...
    99+
    2024-05-14
    golang git
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作