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; 头脑 风暴获取初稿解决编码问题尝试不同的提示格式查找标题寻求帮助…

Android 内存泄漏的常见原因及其对应的解决方案

Android 内存泄漏 Android应用程序中常见的内存泄漏原因有很多&#xff0c;以下是一些常见的原因及对应的解决方案&#xff1a; 1. 静态引用导致的内存泄漏&#xff1a; 静态变量持有对Activity或Fragment的引用&#xff0c;导致它们无法被垃圾回收机制释放。 解决方案&…

rk3588+视频采集(mpp硬编码H.265)

rk3588+视频采集(mpp硬编码H.265) mpp硬编码 mpp硬编码可以压缩500倍左右,详细代码见该专栏文章《MPP硬编码H265(500倍压缩)》; 视频采集 本案例是通过opencv+定时器(需按照FPS刷新)获取frame; 自定义一个counter计数,保存counter个帧; 当需要保存一个视频时: 可…

DASCTF密码第一题,bbcrypto

貌似叫这个名字。 # -*- coding:utf-8 -*- import A,SALT from itertools import *def encrypt(m, a, si):c""for i in range(len(m)):chex(((ord(m[i])) * a ord(next(si))) % 128)[2:].zfill(2)return c if __name__ "__main__":m flag{************…

随手笔记——实现去畸变部分的代码

随手笔记——实现去畸变部分的代码 说明关键代码 说明 本程序实现去畸变部分的代码。尽管我们可以调用OpenCV的去畸变&#xff0c;但自己实现一遍有助于理解。 关键代码 // 本程序实现去畸变部分的代码。尽管我们可以调用OpenCV的去畸变&#xff0c;但自己实现一遍有助于理解…

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

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

Centos终端显示-bash-4.2#的解决方法

登录linux系统过后&#xff0c;突然发现显示的是-bash-4.2# 而不是root主机名 路径的显示方式&#xff0c;发生这种情况的原因是根目录下缺失几个配置文件&#xff0c;从默认配置中拷贝过来就可以解决了。 cp /etc/skel/.bashrc /root/ cp /etc/skel/.bash_profile /root/如…

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",…

解决yolo3目标检测训练过程中train.py运行问题

yolo3是一种广泛使用的目标检测算法&#xff0c;它在计算机视觉领域具有很高的准确率和性能。然而&#xff0c;在使用yolo3进行目标检测训练时&#xff0c;有时会出现train.py运行问题。本文将探讨如何解决这个问题。 首先&#xff0c;让我们了解一下训练过程中可能遇到的常见…