Flutter阴影效果插件shady的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter阴影效果插件shady的使用

开始使用

使用 Flutter 3.7 或更新版本,并遵循 此指南

如何使用

以下是使用 Shady 插件的步骤:

步骤 1: 准备 Shady 实例

在你的代码中,创建一个包含着色器程序细节的 Shady 实例。请注意添加所有的统一变量和纹理采样器,并且要按照它们在着色器程序中出现的顺序添加。

/* assets/shaders/my_shader.frag */

uniform float uniformOne;
uniform float uniformTwo;
uniform sampler2D textureOne;

[...]
/* Flutter代码 */

final shady = Shady(
  assetName: 'assets/shaders/my_shader.frag',
  uniforms: [
    UniformFloat(key: 'uniformOne'),
    UniformFloat(key: 'uniformTwo'),
  ],
  samplers: [
    TextureSampler(
      key: 'textureOne',
      asset: 'assets/texture1.png',
    ),
  ],
);

步骤 2: 使用 ShadyCanvas 显示着色器

在你希望显示着色器的地方使用一个预设的小部件。

SizedBox(
  width: 200,
  height: 200,
  child: ShadyCanvas(shady),
),

步骤 3: 在运行时修改着色器参数

你可以通过 Shady 实例在运行时修改着色器参数。

shady.setUniform<double>('uniformOne', 0.4);
shady.setTexture('textureOne', 'assets/texture2.png');
shady.setBlendMode(BlendMode.modulate);

其他功能

变换器

变换器是在每一帧被调用的回调函数,用于根据上一帧的值和时间差来变换统一变量的值。

UniformFloat(
  key: 'uniformOne',
  transformer: (previousValue, deltaDuration) {
    return previousValue + (deltaDuration.inMilliseconds / 1000);
  },
)

也可以使用预定义的变换器:

UniformFloat(
  key: 'uniformOne',
  transformer: UniformFloat.secondsPassed,
)

变换器可以在任何时候切换:

shady.setTransformer<double>(
  'uniformOne',
  (previousValue, deltaDuration) {
    // 让它快两倍!
    return previousValue + ((deltaDuration.inMilliseconds / 1000) * 2);
  },
);

使用 ShaderToy 着色器

ShaderToy 是一个很棒的 GLSL 实验平台。然而,两者在如何编写着色器方面都有些怪癖和魔法。

要使用 ShaderToy 着色器(有一些限制),请将其包装如下:

#include <flutter/runtime_effect.glsl>
uniform vec3 iResolution;
uniform float iTime;
uniform float iTimeDelta;
uniform float iFrameRate;
uniform vec4 iMouse;
out vec4 fragColor;
uniform sampler2D iChannel0;
uniform sampler2D iChannel1;
uniform sampler2D iChannel2;
////////////// Shadertoy BEGIN

[ 粘贴你的 ShaderToy 着色器代码 ]

////////////// Shadertoy END
void main(void) { mainImage(fragColor, FlutterFragCoord()); }

然后,在创建 Shady 实例时,使用 shaderToy 参数自动添加并连接 ShaderToy 统一变量。支持的统一变量将像在 ShaderToy 上一样自动更新。

Shady(
  assetName: 'assets/shaders/my_shadertoy_shader.frag',
  shaderToy: true,
)

只支持 ShaderToy 列出的统一变量,并且通道只支持 2D 纹理 (sampler2D)。

交互式着色器

Shady 包含一个方便的小部件来处理交互式着色器。它会将交互连接到选定的统一变量,并提供回调以进行拦截。

ShadyInteractive(
  shady,

  // 这个 vec2 统一变量将保存最近交互的归一化坐标。
  uniformVec2Key: 'inputCoord',

  // 交互时调用的回调。
  onInteraction: (coord) => print('被交互于 $coord'),
)

更多关于Flutter阴影效果插件shady的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter阴影效果插件shady的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于在Flutter中使用shady插件来实现阴影效果,下面是一个简单的代码示例,展示了如何使用该插件。

首先,确保你已经在pubspec.yaml文件中添加了shady依赖:

dependencies:
  flutter:
    sdk: flutter
  shady: ^latest_version  # 请替换为最新的版本号

然后运行flutter pub get来安装依赖。

以下是一个完整的示例代码,展示如何在Flutter应用中使用shady插件为Widget添加阴影效果:

import 'package:flutter/material.dart';
import 'package:shady/shady.dart'; // 导入shady插件

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Shady Example'),
        ),
        body: Center(
          child: Container(
            width: 200,
            height: 200,
            decoration: BoxDecoration(
              color: Colors.blue,
              borderRadius: BorderRadius.circular(16),
            ),
            child: Shady( // 使用Shady包裹Widget
              child: Center(
                child: Text(
                  'Hello, Shady!',
                  style: TextStyle(color: Colors.white),
                ),
              ),
              blurRadius: 10,
              spreadRadius: 5,
              offset: Offset(2, 2),
              color: Colors.black.withOpacity(0.5),
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. Container 是一个带有蓝色背景和圆角边框的简单容器。
  2. Shady 插件被用来包裹 Container,并为其添加阴影效果。
  3. blurRadius 属性定义了阴影的模糊半径。
  4. spreadRadius 属性定义了阴影的扩展半径。
  5. offset 属性定义了阴影的偏移量。
  6. color 属性定义了阴影的颜色。

Shady 插件通过封装 Flutter 的 ContainerPhysicalShape 等组件,提供了简单的方法来为任何Widget添加阴影效果。

请注意,shady 插件的具体API可能会随着版本更新而变化,因此建议查阅最新的官方文档以获取最准确的信息。

回到顶部