Flutter特效动画插件hyper_effects的使用

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

Flutter特效动画插件hyper_effects的使用

概述

Hyper Effects 是一个受到 SwiftUI 语法启发的Flutter包,旨在创建美观的效果。它使你能够轻松地添加各种效果和过渡动画,而无需复杂的控制器或补间动画。

  • 紧凑语法:一行代码实现多种复杂效果。
  • 一切可动画化:无需动画控制器或补间动画,任何小部件都可以通过一行代码进行动画处理。
  • 滚动过渡:根据小部件在滚动视图中的位置控制其外观。
  • 指针过渡:无需手势检测器或状态管理,基于指针事件控制小部件外观。
  • 易于集成:API设计简单易扩展,如果缺少某种效果,可以轻松添加。

在线演示


安装与配置

安装

pubspec.yaml文件中添加依赖:

dependencies:
  hyper_effects: ^latest_version

或者直接运行命令:

flutter pub add hyper_effects

使用示例

以下是一个简单的例子,展示了如何使用hyper_effects来为一个小部件添加透明度效果:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Hyper Effects Demo')),
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  bool myCondition = false;

  void toggleCondition() {
    setState(() {
      myCondition = !myCondition;
    });
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: toggleCondition,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.blue,
      )
          .opacity(myCondition ? 0 : 1)
          .animate(trigger: myCondition),
    );
  }
}

在这个例子中,点击容器时,它的透明度会在0和1之间切换,并且这个变化是带有动画效果的。


效果列表

效果名称 描述
Opacity 改变小部件的透明度
Blur 应用模糊效果
Scale 缩放小部件
TranslateX 沿X轴平移
TranslateY 沿Y轴平移
TranslateXY 同时沿X轴和Y轴平移
Rotate 旋转小部件
RotateX 绕X轴旋转
RotateY 绕Y轴旋转
RotateZ 绕Z轴旋转
SkewX 沿X轴倾斜
SkewY 沿Y轴倾斜
SkewXY 同时沿X轴和Y轴倾斜
ColorFilter 应用颜色滤镜
Transform 在绘制之前应用变换
ClipRect 使用矩形裁剪子元素
ClipRRect 使用圆角矩形裁剪子元素
RollingText 创建从一种文本滚动到另一种文本的动画
Shake 应用摇晃效果
Align 更改对齐方式
Roll 从小部件的一个状态滚动到另一个状态
Padding 添加内边距

更多细节请参考 源码


动画原理

Hyper Effects 不是一个完整的动画库,而是提供了一种方便的方式来在两个值之间插值。它受SwiftUI语法的影响,允许你在Flutter中体验类似的动画编排方式。理解这一点对于充分利用Hyper Effects非常重要。


高级用法

即时动画

如果你想立即触发动画,可以使用oneShot函数:

Container(
  color: Colors.blue,
).slideInFromBottom().oneShot();

动画序列

使用animateAfter可以让一个动画在前一个动画结束后再开始:

GestureDetector(
  onTap: () {
    setState(() {
      trigger = !trigger;
    });
  },
  child: Image.asset('assets/pin_ball_256x.png', width: 150, height: 150)
      .shake()
      .oneShot(
        delay: const Duration(seconds: 1),
        repeat: -1,
        playIf: () => !trigger,
      )
      .translateY(300, from: 0)
      .animate(
        trigger: trigger,
        curve: Curves.easeOutQuart,
        duration: const Duration(milliseconds: 2000),
        playIf: () => trigger,
      )
      .slideOut(const Offset(0, -300))
      .animateAfter(
        curve: Curves.elasticOut,
        duration: const Duration(milliseconds: 450),
        onEnd: () => setState(() => trigger = false),
      )
      .resetAll(),
);

滚动文本

Rolling Text 特效可以从一个文本滚动到另一个文本,每个字符单独滚动形成新的文本:

Text('Hello').roll(
  'World',
  padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
  tapeStrategy: TapeStrategy.random,
  tapeCurve: Curves.easeInOutQuart,
  tapeSlideDirection: TapeSlideDirection.down,
  staggerTapes: true,
  staggerSoftness: 0.5,
  reverseStaggerDirection: true,
).animate(trigger: myTrigger);

滚动过渡

根据小部件在滚动视图中的位置动态调整其样式:

ListView.builder(
  itemBuilder: (context, index) {
    return Container(
      width: 350,
      height: 100,
      margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
      alignment: Alignment.center,
      decoration: BoxDecoration(
        color: randomColor(index),
        borderRadius: BorderRadius.circular(16),
      ),
      child: Text(
        'Item $index',
        style: const TextStyle(fontSize: 24, color: Colors.white),
      ),
    ).scrollTransition(
      (context, widget, event) =>
      widget
          .blur(
            switch (event.phase) {
              ScrollPhase.identity => 0,
              ScrollPhase.topLeading => 10,
              ScrollPhase.bottomTrailing => 10,
            },
          )
          .scale(
            switch (event.phase) {
              ScrollPhase.identity => 1,
              ScrollPhase.topLeading => 0.9,
              ScrollPhase.bottomTrailing => 0.9,
            },
          ),
    );
  },
);

结论

Hyper Effects 提供了一种简洁且强大的方式来为Flutter应用程序添加丰富的动画效果。无论是简单的透明度变化还是复杂的滚动过渡,它都能帮助开发者快速实现高质量的用户界面交互。如果你希望进一步了解或参与开发,请访问 GitHub仓库 或加入我们的 Discord社区 获取支持。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用hyper_effects插件来创建特效动画的示例代码。hyper_effects是一个强大的Flutter插件,它允许你轻松地在应用中添加复杂的动画效果。

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

dependencies:
  flutter:
    sdk: flutter
  hyper_effects: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你可以在你的Flutter项目中创建一个使用hyper_effects的示例页面。下面是一个简单的示例,展示了如何使用hyper_effects来创建一个带有动画效果的按钮:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Hyper Effects Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Hyper Effects Example'),
      ),
      body: Center(
        child: HyperEffectButton(
          onPressed: () {
            // 按钮点击后的处理逻辑
            print('Button pressed!');
          },
          child: Text(
            'Click Me',
            style: TextStyle(color: Colors.white, fontSize: 20),
          ),
          hyperEffect: HyperEffect.bounce, // 使用bounce动画效果
          backgroundColor: Colors.blue,
          borderRadius: 20,
          padding: EdgeInsets.all(15),
          shadowColor: Colors.grey.withOpacity(0.5),
          elevation: 10,
          animationDuration: 500, // 动画持续时间(毫秒)
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个带有hyper_effects动画效果的按钮。HyperEffectButton是一个自定义的按钮组件,它使用了hyper_effects插件提供的动画效果。在这个例子中,我们使用了bounce动画效果,但hyper_effects还提供了其他多种动画效果,如rotatepulse等,你可以根据需要选择使用。

请注意,HyperEffectButton是一个假设的组件,因为hyper_effects插件可能并不直接提供一个名为HyperEffectButton的组件。但是,你可以根据hyper_effects插件的文档和API来创建一个类似的自定义组件,或者使用插件提供的其他动画组件和函数来实现类似的动画效果。

为了实际使用hyper_effects插件中的具体组件和动画效果,请参考插件的官方文档和示例代码。希望这个示例能帮助你开始使用hyper_effects插件来创建Flutter应用中的特效动画。

回到顶部