[译] 使用 Flutter 制作 3D 翻转动画,赶紧收藏备战金三银四

   children: [
    ClipRect(
        child: Align(
      alignment: Alignment.topCenter,
      heightFactor: 0.5,
      child: child,
    )),
    Padding(
      padding: EdgeInsets.only(top: 2.0),
    ),
    ClipRect(
        child: Align(
      alignment: Alignment.bottomCenter,
      heightFactor: 0.5,
      child: child,
    )),
  ],
);

}
}


尝试一下:

![](https://user-gold-cdn.xitu.io/2018/7/23/164c4d613b41e47f?imageView2/0/w/1280/h/960/ignore-error/1)

就是这样。此外,**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,
)),
),

],
);
}


尝试一下:

![](https://user-gold-cdn.xitu.io/2018/7/23/164c4d6140cb30b7?imageView2/0/w/1280/h/960/ignore-error/1)

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

到底怎么回事呢?回答出这个问题是这个任务中最难的一点。我回看 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,
)),
),


再试一下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DIj8qpb-1630675591387)(https://user-gold-cdn.xitu.io/2018/7/23/164c4d613f0bf464?imageView2/0/w/1280/h/960/ignore-error/1)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07qugUC4-1630675591389)(https://user-gold-cdn.xitu.io/2018/7/23/164c4d6280ece081?imageslim)]

这个动画实现的代码很长,在此处插入并不太好。你可以在本文底部的链接中找到它。这是我们的最终效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A25jD3bM-1630675591390)(https://user-gold-cdn.xitu.io/2018/7/23/164c4d6142c35ae1?imageslim)]

真棒。我们刚刚用 Flutter 完成了另一个 UI 挑战。**熟能生巧**。我会继续寻找新的挑战,使用 Flutter 解决它,并与你分享结果。感谢阅读。

**P/S:透视变换出现了个小问题(会导致变换后的图像偏斜),我在 rotateX() 中使用一个非常小的值而不是零,可以暂时解决这个问题。**

> **完整代码:** [gist.github.com/hnvn/f1094f…](
)

> **我已将我的代码发布,包名为** [**flip\_panel**](
)

> 如果发现译文存在错误或其他需要改进的地方,欢迎到 [掘金翻译计划](
) 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 **本文永久链接** 即为本文在 GitHub 上的 MarkDown 链接。

* * *

> [掘金翻译计划](
) 是一个翻译优质互联网技术文章的社区,文章来源为 [掘金](
) 上的英文分享文章。内容覆盖 [Android](
)、[iOS](
)、[前端](
)、[后端](
)、[区块链](
)、[产品](
)、[设计](
)、[人工智能](
)等领域,想要查看更多优质译文请持续关注 [掘金翻译计划](
)、[官方微博](
)、[知乎专栏](
)。

# 最后

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

**上述【高清技术脑图】以及【配套的架构技术PDF】**

**[CodeChina开源项目地址:https://codechina.csdn.net/m0_60958482/android_p7](https://codechina.csdn.net/m0_60958482/android_p7)**

> 为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

82/android_p7](https://codechina.csdn.net/m0_60958482/android_p7)**

> 为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

Android架构师之路很漫长,一起共勉吧!

你可能感兴趣的:(Android,flutter,动画,移动开发)