[译] 使用 Flutter 制作 3D 翻转动画,Android开发者必看避坑指南

尝试一下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是这样。此外,child 可以让我们随心所欲设计动画的内容(无论如何是文本,还是图像)。

  • 围绕 X 轴旋转一半面板

Transform 组件有一个 transform 参数,类型是 Matrix4,用于定义所应用的变换类型。Matrix4 暴露了一个名为 rotationX() 的工厂构造函数,看起来是我们需要用的,让我们尝试一下用在面板的上半部分:

@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Transform(
transform: Matrix4.rotationX(pi / 4),
alignment: Alignment.bottomCenter,
child: ClipRect(
child: Align(
alignment: Alignment.topCenter,
heightFactor: 0.5,
child: child,
)),
),

],
);
}

尝试一下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

什么!!!!它看起来像放缩效果,不是吗?

到底怎么回事呢?回答出这个问题是这个任务中最难的一点。我回看 Flutter 的文档、示例代码、文章……直到找到这篇文章。其中指出,改变 Matrix4 的第 3 行和第 2 列的值,会改变其视角,并且会给变形带来 3D 效果:


Transform(
transform: Matrix4.identity()…setEntry(3, 2, 0.006)…rotateX(pi / 4),
alignment: Alignment.bottomCenter,
child: ClipRect(
child: Align(
alignment: Alignment.topCenter,
heightFactor: 0.5,
child: child,
)),
),

再试一下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不错。但是不如试一下神奇的数字 0.006?说实话,我不知道如何准确计算它,只是尝试选个我感觉很好的一些值。

剩下的就是为我们的组件添加动画。这里有一点点棘手。实际上,每个面板都有两面(正面和背面)的内容,但是在代码中实现它并不明智,因为同一时刻只能看到一面。我假设要创建一个面板向上翻转的动画,那么动画可以分解成连续的两个阶段(顺序),第一个是向上翻转下半部分以使动画显示下一个面板的下半部分,然后隐藏当前面板的下半部分,第二个是在同一方向翻转上半部分,以显示下一半的上半部分,同时隐藏当前的上半部分:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个动画实现的代码很长,在此处插入并不太好。你可以在本文底部的链接中找到它。这是我们的最终效果:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
真棒。我们刚刚用 Flutter 完成了另一个 UI 挑战。熟能生巧。我会继续寻找新的挑战,使用 Flutter 解决它,并与你分享结果。感谢阅读。
P/S:透视变换出现了个小问题(会导致变换后的图像偏斜),我在 rotateX() 中使用一个非常小的值而不是零,可以暂时解决这个问题。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)*
[外链图片转存中…(img-9aRvodgP-1710929653741)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值