用Provider实现商品加入购物车的动画效果

3,293 阅读2分钟

先上效果图:

我这个项目用Provider来管理状态,几乎所有UI页面都是extends StatelessWidget。当我初次接触Animation,发现要实现动画效果,就要with SingleTickerProviderStateMixin,自然就要extends StatefulWidget,可是我篇篇页面都是StatelessWidget,不想因为实现动画而打破这个常规,于是继续往下找,终于让我找到了,AnimatedContainer。

1.容器

以Stack作为容器,将tab,表格,按钮这些杂七杂八的组件都放在一个Container容器里,AnimatedContainer单独作为一个容器,被包裹在Provider中,置于Container上层。AnimatedContainer与Container互不干扰。

2.孩子

孩子就是一张圆形图片,数据保存的就是你点击衣服的网络(本地)路径.

3.坐标

要实现动画,基本上少不了这三点:起始状态,最终状态,间隔时间。 我先讲终止状态,在我这就是目标坐标,首先我说下,坐标值用的是绝对坐标值x和y。当我点击了一件衣服,圆形图片飞到了购物车位置,怎么获取购物车的绝对坐标值呢,上图

在购物车图片的key中保存了globalKey,实例化和获取值的逻辑我都放在Provider中了

接下来,我讲下起始状态也就是起始坐标值。起始坐标值是动态获取,当我点击一件衣服,就获取我点击位置的绝对坐标值,

GestureDetector有很多关于手势的参数,这些参数都保存了手势操作的坐标值
右边我框的***Details中你能找到globalPosition,在globalPosition就能取到xy值。

间隔时间很简单,我设为1000 milliseconds。

4.1秒中AnimatedContainer干了什么

它更新了xy坐标值,visibility

具体实现逻辑思路,圆形图片一直存在,起初它是隐藏的,坐标在(0,0)处。当我点击了一件衣服,圆形图片以100 milliseconds飞向我点击的xy值,显示圆形图片,紧接着以1000 milliseconds飞向购物车xy值,隐藏圆形图片。附上逻辑图

本人新手,有不对之处,请指教。转载请注明出处。