Flutter动画效果插件bounce的使用

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

Flutter动画效果插件bounce的使用

Bounce

pub package

此包添加了一个新的Bounce小部件,该小部件为Flutter小部件应用了点击触发的弹跳动画。根据触摸位置,还会在子元素上添加倾斜效果。

"Demo of the Bounce plugin"

要查看以下效果的示例,请按照以下步骤操作:

cd example/
flutter run --release

如何使用

首先,在pubspec.yaml文件中添加依赖项:

dependencies:
  bounce: ^<latest-version>

然后,将目标小部件作为Bounce小部件的子元素进行包装。您可以选择指定其他行为,例如通过在构造函数中添加tilt: false来禁用倾斜效果。最简单的使用方法如下:

import 'package:bounce/bounce.dart';

...

return Bounce(
        onTap: () {
          // ...
        },
        child: ...)

自定义行为

倾斜效果

您可以使用tiltAngle指定由倾斜效果应用的最大角度。当在子组件的边缘点击时,会达到此角度。当在子组件的中心点击时,不会应用任何倾斜。

缩放效果

您可以使用scaleFactor参数指定由缩放效果应用的最大因子。

点击延迟

为了微调用户体验,您可能希望各种效果在点击发生后几毫秒内重新动画。默认情况下,此延迟设置为150毫秒。

滤镜质量

Bounce小部件实现将子元素包装在一个基于矩阵的Transform小部件中。在大多数平台上,默认值为FilterQuality.high是一个好的实践。您可以直接从小部件的构造函数中指定其他FilterQuality值:

  Bounce(
    filterQuality: FilterQuality.medium,
    child: ...
  )

由于Safari iOS上的限制,如果您的应用程序针对它,您有责任在此特定浏览器中强制执行filterQualitynull

与Motion小部件组合

Bounce小部件与Motion小部件组合看起来非常棒,就像这样:

  Motion(
    child: Bounce(
      child: ...
    )
  )

这里是一个交互示例:

"Bounce + Motion example"

示例代码

以下是完整的示例代码,演示了如何使用BounceMotion小部件创建一个具有弹跳效果的应用程序。

import 'package:bounce/bounce.dart';
import 'package:flutter/material.dart' hide Card;
import 'package:motion/motion.dart';

import 'card.dart';

const cardBorderRadius = BorderRadius.all(Radius.circular(20));

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  /// Initialize the Motion plugin.
  await Motion.instance.initialize();

  /// ... and run the sample app.
  runApp(const BounceDemoApp());
}

class BounceDemoApp extends StatelessWidget {
  const BounceDemoApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) => const MaterialApp(
        title: 'Bounce Demo',
        debugShowCheckedModeBanner: false,
        home: BounceDemoPage(),
      );
}

class BounceDemoPage extends StatefulWidget {
  const BounceDemoPage({Key? key}) : super(key: key);

  @override
  State<BounceDemoPage> createState() => _BounceDemoPageState();
}

class _BounceDemoPageState extends State<BounceDemoPage> {
  @override
  Widget build(BuildContext context) => Scaffold(
          body: Stack(children: [
        Center(
            child: Column(mainAxisSize: MainAxisSize.min, children: [
          Padding(
              padding: const EdgeInsets.only(bottom: 50),
              child: Text(
                'Bounce example',
                style: Theme.of(context)
                    .textTheme
                    .headlineMedium
                    ?.copyWith(fontWeight: FontWeight.w800, color: const Color.fromARGB(255, 0, 0, 0)),
              )),
          const Card(width: 280, height: 150, borderRadius: cardBorderRadius),
          Padding(
              padding: const EdgeInsets.only(top: 20, bottom: 35),
              child: Text(
                'without Bounce',
                style: Theme.of(context).textTheme.bodyLarge,
              )),
          const SizedBox(width: 70),
          const Bounce(
            child: Motion(
                borderRadius: cardBorderRadius,
                shadow: ShadowConfiguration(blurRadius: 20, topOffset: 15),
                child: Card(
                  width: 280,
                  height: 150,
                  borderRadius: cardBorderRadius,
                )),
          ),
          Padding(
              padding: const EdgeInsets.only(top: 20, bottom: 35),
              child: Text(
                'with Bounce + Motion',
                style: Theme.of(context).textTheme.bodyLarge,
              )),
        ]))
      ]));
}

以上是关于Flutter动画效果插件bounce的使用介绍,包括基本使用方法、自定义行为以及与Motion小部件组合使用的示例代码。希望对您有所帮助!


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

1 回复

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


当然,以下是如何在Flutter项目中使用bounce动画效果插件的一个示例。bounce动画效果通常用于实现具有弹性动画效果的组件,比如按钮点击、列表项滚动等。尽管Flutter本身已经提供了丰富的动画支持,但第三方插件往往能提供更加便捷和定制化的动画效果。

首先,确保你已经在pubspec.yaml文件中添加了bounce插件的依赖。由于bounce插件可能不是官方的或广泛认知的插件名(Flutter社区中的动画插件可能有不同的名称,如flutter_bounce等),这里我们假设一个名为flutter_bounce的插件作为示例。如果实际插件名称不同,请相应调整。

dependencies:
  flutter:
    sdk: flutter
  flutter_bounce: ^x.y.z  # 替换为实际版本号

然后,运行flutter pub get来获取依赖。

接下来,在你的Dart文件中使用flutter_bounce插件来实现动画效果。这里以一个简单的按钮点击动画为例:

import 'package:flutter/material.dart';
import 'package:flutter_bounce/flutter_bounce.dart'; // 假设插件名为flutter_bounce

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

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

class BounceDemoPage extends StatefulWidget {
  @override
  _BounceDemoPageState createState() => _BounceDemoPageState();
}

class _BounceDemoPageState extends State<BounceDemoPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bounce Animation Demo'),
      ),
      body: Center(
        child: BounceButton(
          onPressed: () {
            // 这里可以添加点击后的逻辑,比如导航到其他页面
            print('Button pressed!');
          },
          child: Text(
            'Bounce Me',
            style: TextStyle(fontSize: 20, color: Colors.white),
          ),
          color: Colors.blue,
          bounceEffect: BounceEffect(
            // 配置动画效果,比如持续时间、弹性系数等
            duration: Duration(milliseconds: 300),
            curve: Curves.easeOut,
          ),
        ),
      ),
    );
  }
}

// 假设flutter_bounce插件提供了一个BounceButton组件和BounceEffect配置类
// 如果实际插件API不同,请参考插件文档进行调整
class BounceButton extends StatefulWidget {
  final VoidCallback onPressed;
  final Widget child;
  final Color color;
  final BounceEffect bounceEffect;

  BounceButton({
    required this.onPressed,
    required this.child,
    required this.color,
    required this.bounceEffect,
  });

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

class _BounceButtonState extends State<BounceButton> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: widget.bounceEffect.duration,
      vsync: this,
    )..repeat(reverse: true);

    _animation = Tween<double>(begin: 0.0, end: 1.0).animate(
      CurvedAnimation(
        parent: _controller,
        curve: widget.bounceEffect.curve,
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void _handlePress() {
    setState(() {
      _controller.reset();
      _controller.forward();
    });
    widget.onPressed();
  }

  @override
  Widget build(BuildContext context) {
    return AnimatedBuilder(
      animation: _animation,
      child: Material(
        color: widget.color,
        borderRadius: BorderRadius.circular(20),
        child: InkWell(
          onTap: _handlePress,
          child: widget.child,
        ),
      ),
      builder: (context, child) {
        return Transform.scale(
          scale: 1.0 + (_animation.value - 0.5) * 0.1, // 简单的缩放动画模拟弹性效果
          child: child,
        );
      },
    );
  }
}

// 假设的BounceEffect类,用于配置动画效果
class BounceEffect {
  final Duration duration;
  final Curve curve;

  BounceEffect({required this.duration, required this.curve});
}

注意:上面的代码是基于假设的flutter_bounce插件API进行编写的。实际上,你可能需要查找并安装一个真实的Flutter动画插件(例如flutter_advanced_networkimage提供了图像加载的动画效果,而专门用于按钮或其他组件的弹性动画效果的插件可能有不同的名称)。如果找到了一个合适的插件,请参考其官方文档来调整上述代码以适应实际的API。

此外,Flutter的动画系统非常强大,如果你对自定义动画有较高要求,建议使用Flutter内置的AnimationControllerTweenAnimatedBuilder等类来创建自定义动画效果。

回到顶部