Flutter动画滚动项插件animated_scroll_item的使用

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

Flutter 动画滚动项插件 animated_scroll_item 的使用

Wrapper for the scrollable items (e.g. SingleChildScrollView, ListView). It allows you to highly customize behavior of visible items. Based on Flow widget

example

注意: 请注意,它尚未经过大型列表的测试。


Getting started

Installing
dependencies:
  animated_scroll_item: ^0.0.3
Import
import 'package:animated_scroll_item/animated_scroll_item.dart';

How to use

将您的项目小部件包装在 AnimatedScrollItem 中,并提供其配置:

AnimatedScrollItem(
  configs: [
    ItemAnimationConfig(
        // ...animation config
    ),
    ItemAnimationConfig(
        // ...another animation config
    ),
  ],
  size: const Size(double.infinity, 120), // The size is required
  // Provide your widget
  child: SizedBox(
    height: 120,
    child: Card(
      color: Colors.blue,
      child: Center(
        child: Text('$index'),
      ),
    ),
  ),
),

Configuration

AnimatedScrollItem
参数 描述 类型 默认值
size 每个项目占据的空间大小 Size 必填字段
configs 动画配置列表,您可以定义任意数量的配置,但不能少于一个 List<ItemAnimationConfig> 必填字段
child 您的列表项 Widget 必填字段
ItemAnimationConfig
参数 描述 类型 默认值
itemTransform 基于动画值定义动画项行为的回调。 ItemTransformAnimation 必填字段
opacityTransform 基于动画值定义动画项不透明度的回调。 ItemOpacityTransform null
animationRange 项目在可见区域内的位置范围,进行动画。1 - 可见区域的末尾,0 - 开始 AnimationRange AnimationRange(min: 0, max: 1)
ItemTransformAnimation

提供一个 animationValue 范围从 01 的回调,itemSize 也可以用于您的动画,matrix 是一个 Matrix4 对象,您需要在此对象上应用您的变换。

例如:

itemTransform: (
  double animationValue,
  Size size,
  Matrix4 matrix,
) {
  return matrix
    ..scale(animationValue)
    ..setTranslation(
        Vector3(size.width * (1 - animationValue) * .5, 0, 0));
},
ItemOpacityTransform

此回调允许您根据 animationValue 定义不透明度。

例如:

opacityTransform: (animationValue) => animationValue
AnimationRange

在这里,您可以定义可见列表的一部分,其中项目需要进行动画处理。它接受从 01 的值。 例如:

animationRange: const AnimationRange(min: 0, max: .1),

Contributing

欢迎创建 PR 或提出问题 :)


示例代码

import 'package:animated_scroll_item/animated_scroll_item.dart';
import 'package:flutter/material.dart';
import 'package:vector_math/vector_math_64.dart' hide Colors;

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: ListView.builder(
        padding: const EdgeInsets.symmetric(horizontal: 16),
        itemCount: 30,
        itemBuilder: (context, index) => AnimatedScrollItem(
          configs: [
            ItemAnimationConfig(
              animationRange: const AnimationRange(min: 0, max: .1),
              itemTransform: (
                double animationValue,
                Size size,
                Matrix4 matrix,
              ) {
                return matrix
                  ..scale(animationValue)
                  ..setTranslation(
                      Vector3(size.width * (1 - animationValue) * .5, 0, 0));
              },
              opacityTransform: (animationValue) => animationValue,
            ),
            ItemAnimationConfig(
              animationRange: const AnimationRange(min: .9),
              itemTransform: (
                double animationValue,
                Size size,
                Matrix4 matrix,
              ) {
                return matrix
                  ..scale(1 - animationValue)
                  ..setTranslation(Vector3(size.width * animationValue, 0, 0));
              },
              opacityTransform: (animationValue) => 1 - animationValue,
            ),
          ],
          size: const Size(double.infinity, 120),
          child: SizedBox(
            height: 120,
            child: Card(
              color: Colors.blue,
              child: Center(
                child: Text('$index'),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,animated_scroll_item 是一个用于 Flutter 的强大插件,它可以帮助你创建带有动画效果的滚动项。下面是一个简单的示例,展示如何使用 animated_scroll_item 插件来实现一个带有动画效果的滚动列表。

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

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

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

接下来,在你的 Flutter 应用中使用 animated_scroll_item。下面是一个完整的示例代码:

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

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

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

class AnimatedScrollItemDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animated Scroll Item Demo'),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            AnimatedScrollItemBuilder(
              itemCount: 10,
              itemBuilder: (context, index) {
                return AnimatedScrollItem(
                  index: index,
                  animationDuration: Duration(seconds: 1),
                  builder: (context, animation, index) {
                    return Padding(
                      padding: const EdgeInsets.symmetric(vertical: 16.0),
                      child: Opacity(
                        opacity: animation.value,
                        child: Card(
                          child: ListTile(
                            title: Text('Item $index'),
                          ),
                        ),
                      ),
                    );
                  },
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖导入

    import 'package:animated_scroll_item/animated_scroll_item.dart';
    
  2. AnimatedScrollItemBuilder

    • itemCount:滚动项的总数。
    • itemBuilder:构建每个滚动项的回调函数。
  3. AnimatedScrollItem

    • index:当前滚动项的索引。
    • animationDuration:动画的持续时间。
    • builder:使用动画值构建每个滚动项的回调函数。在这个例子中,我们使用了 Opacity 来实现淡入效果。
  4. 滚动项内容

    • 使用 CardListTile 来展示每个滚动项的内容。

运行这个示例代码,你会看到一个带有动画效果的滚动列表,每个项在滚动到视图时会有一个淡入的效果。

请根据你的实际需求调整动画效果、持续时间和滚动项内容。希望这个示例对你有帮助!

回到顶部