上海启嘟渡科技商贸有限公司
SEARCH

与我们合作

我们专注提供互联网一站式服务,助力企业品牌宣传多平台多途径导流量。
主营业务:网站建设、移动端微信小程序开发、营销推广、基础网络、品牌形象策划等

您也可通过下列途径与我们取得联系:

微 信: wxyunyingzhe

手 机: 15624122141

邮 箱:

Flutter 小技巧之不一样的思路实现炫酷 3D 翻页折叠动画

更新时间:2025-01-06 04:32:07

在Flutter动画实现中,有一个有趣的话题——如何制作一个3D折叠动画效果?许多人可能会首先想到使用Dart中的矩阵变换和Canvas来实现。

这种效果在当前的小说阅读器场景中非常常见,而类似的翻页效果通常是通过这种思路实现的。例如,我曾经尝试过的《炫酷的3D卡片和帅气的360°展示效果》以及《用纯代码实现立体Dash和3D掘金Logo》都是利用矩阵变换实现的视觉3D效果。

然而,今天我要介绍一个名为riveo_page_curl的项目,它提供了一个与众不同的实现方法,即通过自定义Fragment Shaders来实现动画。这种方式允许开发者使用GLSL语言进行编程,从而通过GPU渲染出更丰富的图形效果。

在介绍这个项目之前,我们先来了解一下Fragment Shader。自Flutter 3.7版本开始,就提供了Fragment Shader API。这个API允许开发者直接介入到Flutter渲染管道的渲染流程中。

直接使用Fragment Shader而不是Dart矩阵变换的好处是,它可以减少CPU的耗时。通过图形语言(GLSL)直接给GPU发送指令,性能上可以得到提升,并且实现起来更简洁。不过,加载着色器可能会带来一定的开销,因此需要在运行时将其编译为特定于平台的着色器。

在Flutter中使用Fragment Shader也有一些条件限制,例如需要引入特定的头文件,以及只支持.frag格式的文件。

如果需要将已有的GLSL效果(如shadertoy上的代码)搬运到Flutter中,可能需要进行一些代码改造。以下是一段渐变动画的着色器示例,以及它在Flutter中的对应代码。

通过这些片段着色器,我们可以获得极其丰富的渲染效果。在Flutter中,渐变动画的完整代码可以在GitHub上的相应仓库中找到。

riveo_page_curl项目中的折叠着色器包含了一些矩阵变换和三角函数计算。它的核心在于计算弯曲部分的弧度,并增加阴影投影以提高视觉效果。

在Dart层,除了ShaderBuilder之外,还可以通过flutter_shaders的AnimatedSampler来实现更简洁的shader、image和canvas的配合。

完整项目可以在GitHub上查看。相比在Dart层实现3D翻页折叠,使用FragmentShader实现的代码更加简洁,性能体验也更优秀。此外,通过简单的移植适配,ShaderToy里的着色器代码可以直接在Flutter中使用,这对于Flutter在游戏场景的实现非常有帮助。

最后,Flutter 3.10版本之后,Flutter Web也支持了fragment shaders,因此着色器在Flutter的实现已经相对成熟。如果将之前通过Flutter实现的《霓虹灯文本的「故障」效果》的逻辑转换成fragment shaders来完成,性能和代码简洁程度也可能会有所提升。

多重随机标签

猜你喜欢文章

QQ客服 电话咨询