flutter开发实战-卡片翻转动画效果Transform+IndexedStack+rotateAnimation

flutter开发实战-实现卡片翻转动画效果

之前开发中遇到了商品卡片翻转,商品正面是商品图片、商品名称;背面是商品价格,需要做卡片翻转动画。
动画实现即:在一段时间内,快速地多次改变UI外观;由于人眼会产生视觉暂留,所以最终看到的就是一个“连续”的动画。
这里实现翻转动画,实现方案Transform+IndexedStack
IndexedStack在翻转角度不同,显示对应的card信息
index: _rotateAnimation.value < pi / 2.0 ? 0 : 1,

一、效果图

运行后效果图如下

在这里插入图片描述
在这里插入图片描述

二、代码实现

IndexedStack

IndexedStack({super.key,super.alignment,super.textDirection,super.clipBehavior,StackFit sizing = StackFit.loose,this.index = 0,super.children,}) : super(fit: sizing);

完整动画效果代码如下

import 'dart:async';
import 'dart:math';
import 'dart:ui';import 'package:flutter/material.dart';class GoodsCardFlip extends StatefulWidget {const GoodsCardFlip({super.key, required this.cardSize});final Size cardSize;State<GoodsCardFlip> createState() => _GoodsCardFlipState();
}class _GoodsCardFlipState extends State<GoodsCardFlip>with TickerProviderStateMixin {late AnimationController _animationController;// 翻转动画late Animation<double> _rotateAnimation;late AnimationStatus _lastStatus = AnimationStatus.dismissed;Timer? _globalFlipTimer;// 定义一个翻转从左往右,为false,如果为true,则从右往左开始翻转bool _flipReversal = false;int _flipDelay = 0; // 从左向右延迟翻转时间int _flipReversalDelay = 0; // 从右向左延迟翻转时间bool _isSetFlipDelay = false;bool _isDisposed = false;void initState() {// TODO: implement initStatesuper.initState();_isDisposed = false;_flipReversal = false;_animationController =AnimationController(vsync: this, duration: Duration(milliseconds: 500));//使用弹性曲线_rotateAnimation =CurvedAnimation(parent: _animationController, curve: Curves.linear);_rotateAnimation = Tween(begin: 0.0, end: pi).animate(_rotateAnimation);_animationController.addListener(() {if (mounted) {setState(() {});}});_animationController.addStatusListener((status) {if (status == _lastStatus) return;_lastStatus = status;});// 横屏的全部翻转到价值的控制定时器_globalFlipTimer = new Timer.periodic(new Duration(seconds: 15), (timer) {// 整体翻转动画flipCards();});}void timerDispose() {_globalFlipTimer?.cancel();_globalFlipTimer = null;}void animationDispose() {_animationController.dispose();}void dispose() {// TODO: implement disposeanimationDispose();timerDispose();super.dispose();_isDisposed = true;}void switchCard() {}Widget build(BuildContext context) {return buildGlobal();}Matrix4 _buildTransform() {final matrix = Matrix4.identity()..rotateY(_rotateAnimation.value);return matrix;}Widget buildGlobal() {return Container(width: widget.cardSize.width,height: widget.cardSize.height,alignment: Alignment.center,child: ClipRRect(borderRadius:BorderRadius.all(Radius.circular(13.0)),child: Transform(transform: _buildTransform(),alignment: Alignment.center,child: IndexedStack(alignment: Alignment.center,children: <Widget>[buildFront(),buildBack(),],index: _rotateAnimation.value < pi / 2.0 ? 0 : 1,),),),);}Widget buildFront() {return GoodsImageCard(cardSize: widget.cardSize,);}Widget buildBack() {return Transform(alignment: Alignment.center,transform: Matrix4.identity()..rotateY(pi),child: GoodsPriceCard(cardSize: widget.cardSize,),);}// 处理定时器void flipCards() {int delay = 0;if (_isSetFlipDelay == false) {// 如果从右向左,翻转时,则卡片在右侧的delay小于卡片在左侧的delay// 每次间隔的翻转延迟时间,100毫秒double perDelay = 100.0;_flipDelay = delay;// 如果从右向左,翻转时,则卡片在右侧的delay小于卡片在左侧的delayint reversalDelay =100;_flipReversalDelay = reversalDelay;} else {if (_flipReversal) {// 如果从右向左,翻转时,则卡片在右侧的delay小于卡片在左侧的delaydelay = _flipReversalDelay;} else {delay = _flipDelay;}}_isSetFlipDelay = true;Future.delayed(Duration(milliseconds: delay), () {cardFlip(_flipReversal);});}// 翻转动画void cardFlip(bool reverse) {if (_isDisposed == true) {return;}if (_animationController.isAnimating) return;if (reverse) {_animationController.reverse();} else {_animationController.forward();}_flipReversal = !_flipReversal;if (_flipReversal == true) {Future.delayed(Duration(seconds: 5), () {flipCards();});}}
}class GoodsImageCard extends StatelessWidget {const GoodsImageCard({super.key, required this.cardSize});final Size cardSize;Widget build(BuildContext context) {return Container(width: cardSize.width,height: cardSize.height,color: Colors.greenAccent,alignment: Alignment.center,child: Text('详情card',style: TextStyle(fontSize: 26,fontWeight: FontWeight.w700,fontStyle: FontStyle.normal,color: Colors.white,decoration: TextDecoration.none,),),);}
}class GoodsPriceCard extends StatelessWidget {const GoodsPriceCard({super.key, required this.cardSize});final Size cardSize;Widget build(BuildContext context) {return Container(width: cardSize.width,height: cardSize.height,color: Colors.blueAccent,alignment: Alignment.center,child: Text('价格card',style: TextStyle(fontSize: 26,fontWeight: FontWeight.w700,fontStyle: FontStyle.normal,color: Colors.white,decoration: TextDecoration.none,),),);}
}

三、小结

flutter开发实战-Canvas绘图之Path路径动画

flutter开发实战-实现卡片翻转动画效果,实现方案Transform+IndexedStack,IndexedStack在翻转角度不同,显示对应的card信息。

学习记录,每天不停进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FL Studio是什么软件?FL Studio2023最新更新内容

FL Studio是什么软件 FL Studio是由比利时软件公司Image-Line开发的音乐制作软件&#xff0c;它拥有丰富的音效、合成器、采样器、鼓机等工具。FL Studio支持多种音频文件格式&#xff0c;包括MIDI、MP3、WAV、OGG等&#xff0c;可以帮助用户自由地进行音乐创作。 FL Studio界…

如何有效利用chatgpt?

如何有效地使用ChatGPT&#xff1f; 代码、诗歌、歌曲和短篇小说都可以由 ChatGPT 以特定的风格编写。您所需要的只是正确的问题和适当的提示。以下是有关如何有效使用ChatGPT的一些提示和想法&#xff1a; 头脑 风暴获取初稿解决编码问题尝试不同的提示格式查找标题寻求帮助…

WordPress作为可扩展的企业级解决方案

网络商业世界就像一片汪洋大海&#xff0c;大型企业是大海中最大的鱼。然而&#xff0c;只因为你比其他人都大&#xff0c;并不意味着你不能逆流而上。相反&#xff0c;企业业务面临的挑战更大&#xff0c;对网站的技术要求更高。 多年来&#xff0c;大型公司通常依赖最昂贵的…

Linux总线设备驱动模型

1. 简介 驱动模型中的总线可以是真是存在的物理总线&#xff08;USB总线&#xff0c;I2C总线&#xff0c;PCI总线&#xff09;&#xff0c;也可以是为了驱动模型架构设计出的虚拟总线&#xff08;Platform总线&#xff09;。为此linux设备驱动模型都将围绕"总线–设备–驱…

科普一下Elasticsearch中BM25算法的使用

首先还是先了解几个概念&#xff0c;Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;它使用一系列算法来计算文档的相关性分数&#xff08;relevance score&#xff09;。这些算法用于确定查询与文档的匹配程度&#xff0c;以便按相关性对搜索结果进行排序。以下是…

生命在于折腾——MacOS(Inter)渗透测试环境搭建

一、前景提要 之前使用的是2022款M2芯片的MacBook Air 13寸&#xff0c;不得不说&#xff0c;是真的续航好&#xff0c;轻薄&#xff0c;刚开始我了解到M芯片的底层是ARM架构&#xff0c;我觉得可以接受&#xff0c;虚拟机用的不多&#xff0c;但在后续的使用过程中&#xff0…

换零钱II:零钱面值动态变化,class方法自动兑换最少零钱(贪心算法)

银行现存零钱面值种类动态变化但数量无限&#xff0c;类方法change()完成指定金额的最少零钱个数兑换。 (本笔记适合学透python基本数据结构&#xff0c;熟悉class的基构造&#xff0c;对类内全局变量有一定认的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1…

RabbitMQ消息堆积问题及惰性队列

一&#xff0c;消息堆积 1&#xff0c;消费者堆积问题 当生产者生产消息的速度超过了消费者处理消息的速度&#xff0c;就会导致消息在队列中进行堆积&#xff0c;一定时间后会造成队列达到存储的上限&#xff0c;那么最开始进入队列的消息可能变成死信&#xff0c;会被丢弃&…

【软件测试】Git 详细实战-打标签,一篇通关...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Git 打标签 一般会…

dede编辑器修改成纯文本编辑器的方法

我在做优秀啦网站大全的时候需要的正文内容都不需要设置什么文字样式&#xff0c;所以我需要把编辑器上的工具全部取消掉&#xff0c;包括会员投稿中的编辑器工具栏全部取消掉或者屏蔽隐藏掉&#xff0c;所以我需要把DEDE编辑器修改成纯文本编辑器的方法如下&#xff1a;如图&a…

防范 XSS 攻击的措施

防范 XSS 攻击的措施 XSS&#xff08;Cross-site scripting&#xff09;攻击是一种常见的网络安全漏洞&#xff0c;它可以通过注入恶意代码来攻击用户的计算机和浏览器&#xff0c;从而窃取用户的敏感信息或执行恶意操作。本篇文章将介绍防范 XSS 攻击的措施&#xff0c;并提供…

【深度学习论文阅读】四大分类网络之AlexNet

ImageNet Classification with Deep Convolution Nerual Networks 论文原文&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks 1 引言 解决的问题&#xff1a; 提高效率&#xff08;GPU训练&#xff09;&#xff0c;防止过拟合&#xff08;drop…

基于Java的考研教室在线预约系统/基于springboot的考研教室在线预约系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把考研教室在线预约与现在网络相结合&#xff0c;利用java语言建设考研教室在线预约系统&#xff0c;实现考研教室在线预约的信息化。则对于进一步提高考研教室在线预约发展&#xff0c;丰富考研教室在线预约能起到不少的促进…

语义分割混淆矩阵、 mIoU、mPA计算

一、操作 #vx:桔子code / juzicode.com import cv2 img_gray cv2.imread("nezha.jpg",cv2.IMREAD_GRAYSCALE) for i in range(22):dst cv2.applyColorMap(img_gray,i) cv2.imshow(map,dst) cv2.waitKey(500)cv2.imwrite("map-"str(i)".jpg",…

5G全网通工业三防平板Windows移动电脑

当今科技领域的快速发展为我们的生活带来了许多便利和高效性能。在这个数字化时代&#xff0c;移动设备已成为我们生活的重要组成部分。在这一领域&#xff0c;搭载全新第12代英特尔酷睿Mi5-1235U/i7-1255U处理器的工业三防平板Windows移动电脑无疑是一款引人注目的产品。 这款…

无法找到docker.sock

os环境&#xff1a;麒麟v10(申威) 问题描述&#xff1a; systemctl start docker 然后无法使用docker [rootnode2 ~]# systemctl restart docker [rootnode2 ~]# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon r…

vue3使用下载附件功能

效果&#xff1a; 点击即可以下载打开。 代码&#xff1a; <div v-show"item.attachment.length > 0"><h3>下载附件</h3><divv-for"(doc, docIndex) in item.attachment":key"docIndex"><astyle"color: #41…

技术架构的演进-八大架构

目录&#xff1a; 常见概念评价指标单机架构应用数据分离架构应用服务集群架构读写分离 / 主从分离架构引入缓存 —— 冷热分离架构垂直分库业务拆分 —— 微服务容器化引入——容器编排架构总结 1.常见概念&#xff1a; 应用&#xff08;Application&#xff09; / 系统&am…

栈的压入、弹出序列

链接: 栈的压入、弹出序列 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param pushV int整型vector * param popV int整型vector * return bool布尔型*/bool IsPopOrder(vector<int…

zeppelin的hive使用

zeppelin的hive使用 配置项 default.driver org.apache.hive.jdbc.HiveDriver default.url jdbc:hive2://192.168.xxx.xxx:10000 default.user hiveHive使用&#xff1a;点击create new note Default Interpreter选择hive