Flutter液态动画效果插件liquid_container的使用

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

Flutter液态动画效果插件liquid_container的使用

Flutter作为一个跨平台的UI框架,为开发者提供了丰富的动画和交互效果实现能力。liquid_container插件则进一步增强了这一能力,它能够创建出具有液态物理特性的容器组件,让应用界面更加生动有趣。

插件特性

  • 易于使用:简单的API设计使得开发者可以快速上手。
  • 高度可定制:提供多个参数用于调整液态效果的具体表现形式。
  • 纯Dart编写:完全由Dart语言开发,与Flutter项目无缝集成。

开始使用

要开始使用liquid_container,首先需要在项目的pubspec.yaml文件中添加依赖:

dependencies:
  liquid_container: ^1.0.4

然后执行命令flutter packages get来获取并安装该包。

接下来,在你的Dart文件顶部导入这个库:

import 'package:liquid_container/liquid_container.dart';

使用示例

下面是一个完整的示例代码,展示了如何创建一个带有液态效果的按钮,并且当用户点击时会触发一些反馈(如显示SnackBar)。

完整示例代码

import 'package:flutter/material.dart';
import 'package:liquid_container/liquid_container.dart';

void main() {
  runApp(const LiquidApp());
}

class LiquidApp extends StatelessWidget {
  static const title = 'Liquid Container';

  const LiquidApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: title,
      theme: ThemeData.dark(),
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
        ),
        body: ListView(
          children: const [
            BigNoiseLiquidWidget(),
            SizedBox(height: 300),
          ],
        ),
      ),
    );
  }
}

class BigNoiseLiquidWidget extends StatefulWidget {
  const BigNoiseLiquidWidget({super.key});

  @override
  _BigNoiseLiquidWidgetState createState() => _BigNoiseLiquidWidgetState();
}

class _BigNoiseLiquidWidgetState extends State<BigNoiseLiquidWidget> {
  static const _label = 'Big Noise';
  
  final optionsParam = Options(
    layers: [
      LayerModel(
        points: [],
        viscosity: 0.9, // 粘度
        touchForce: 30, // 触摸力度
        forceLimit: 15, // 力量限制
        color: const Color(0xFF00FF00), // 层的颜色
      ),
      LayerModel(
        points: [],
        viscosity: 0.9,
        touchForce: 50,
        forceLimit: 10,
        color: const Color(0xFF0000FF),
      ),
      LayerModel(
        points: [],
        viscosity: 0.9,
        touchForce: 50,
        forceLimit: 10,
        color: const Color(0xFFFF0000),
      ),
    ],
    gap: 30, // 层之间的间距
    noise: 30, // 噪声级别
    forceFactorBuild: 10, // 构建时的力量因子
    forceFactorOnTap: 150, // 点击时的力量因子
    scaleOptionLayer: [1, 0.9, 0.8], // 各层的比例缩放
  );

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 200,
      margin: const EdgeInsets.only(left: 10, right: 30, top: 100),
      child: LiquidContainer(
        onTap: _onTapToLiquidButton,
        optionsParam: optionsParam,
        boxDecorationLabel: _borderForm(),
        child: _buildForegroundChild(),
      ),
    );
  }

  BoxDecoration _borderForm() {
    return const BoxDecoration(
      borderRadius: BorderRadius.only(
        topLeft: Radius.circular(40),
        topRight: Radius.circular(80),
        bottomLeft: Radius.circular(150),
        bottomRight: Radius.circular(20),
      ),
    );
  }

  void _onTapToLiquidButton() {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 20),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              const Text(
                _label,
                style: TextStyle(
                  fontSize: 20,
                  fontWeight: FontWeight.w900,
                  color: Color(0xFF00FFD5),
                ),
              ),
              IconButton(
                onPressed: ScaffoldMessenger.of(context).clearSnackBars,
                icon: const Icon(
                  Icons.close,
                  size: 30,
                  color: Colors.redAccent,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Row _buildForegroundChild() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: const <Widget>[
        Icon(
          Icons.liquor_outlined,
          color: Color(0xFF00FFD5),
          size: 60,
        ),
        SizedBox(width: 5),
        Text(
          _label,
          style: TextStyle(
            fontSize: 36,
            fontWeight: FontWeight.w900,
            color: Color(0xFF00FFD5),
          ),
        ),
      ],
    );
  }
}

这段代码创建了一个名为LiquidApp的应用程序,其中包含了一个名为BigNoiseLiquidWidget的部件。这个部件通过LiquidContainer实现了液态动画效果,并且可以在点击后弹出一个Snackbar作为反馈信息。此外,还定义了一些自定义样式,比如边框圆角等,以满足不同的设计需求。

希望这个指南能帮助你更好地理解和使用liquid_container插件!如果有任何问题或建议,请随时提出。


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

1 回复

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


当然,以下是如何在Flutter中使用liquid_container插件来实现液态动画效果的代码示例。

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

dependencies:
  flutter:
    sdk: flutter
  liquid_container: ^x.y.z  # 请替换为最新版本号

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

以下是一个完整的Flutter应用示例,展示如何使用liquid_container插件:

import 'package:flutter/material.dart';
import 'package:liquid_container/liquid_container.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Liquid Container Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LiquidContainerDemo(),
    );
  }
}

class LiquidContainerDemo extends StatefulWidget {
  @override
  _LiquidContainerDemoState createState() => _LiquidContainerDemoState();
}

class _LiquidContainerDemoState extends State<LiquidContainerDemo> with SingleTickerProviderStateMixin {
  bool _isContainerVisible = true;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Liquid Container Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                setState(() {
                  _isContainerVisible = !_isContainerVisible;
                });
              },
              child: Text(_isContainerVisible ? 'Hide Container' : 'Show Container'),
            ),
            SizedBox(height: 20),
            AnimatedSwitcher(
              duration: Duration(seconds: 1),
              switchInCurve: Curves.easeInOut,
              switchOutCurve: Curves.easeInOut,
              child: _isContainerVisible
                  ? LiquidContainer(
                      waveType: WaveType.liquid,
                      borderRadius: BorderRadius.circular(20),
                      width: 300,
                      height: 300,
                      child: Container(
                        color: Colors.blue,
                        alignment: Alignment.center,
                        child: Text(
                          'Hello, Liquid!',
                          style: TextStyle(color: Colors.white, fontSize: 24),
                        ),
                      ),
                    )
                  : Container(),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖安装:在pubspec.yaml文件中添加liquid_container依赖。
  2. Main Application:创建一个基本的Flutter应用程序,包括一个MaterialApp和一个LiquidContainerDemo主页。
  3. Stateful WidgetLiquidContainerDemo是一个有状态的Widget,包含一个布尔变量_isContainerVisible来控制容器的显示和隐藏。
  4. ElevatedButton:一个按钮用于切换容器的显示状态。
  5. AnimatedSwitcher:使用AnimatedSwitcher来实现容器的平滑切换动画。
  6. LiquidContainer:当_isContainerVisibletrue时,显示LiquidContainer,并设置一些属性如waveTypeborderRadiuswidthheight

这个示例展示了如何使用liquid_container插件创建一个带有液态动画效果的容器,并通过按钮控制其显示和隐藏。你可以根据需要进一步自定义和扩展这个示例。

回到顶部