Flutter摇晃动画列表插件shaky_animated_listview的使用

Flutter摇晃动画列表插件shaky_animated_listview的使用

插件介绍

Shaky_animated_list 是一个用于实现列表和网格视图滚动动画的Flutter插件。它主要可以用于以下三种场景:

  1. 列表视图滚动动画:为列表视图的滚动添加动画效果。
  2. 网格视图首项动画:为网格视图的第一个项目添加动画效果。
  3. 网格视图滚动动画:为网格视图的滚动添加动画效果。

这些动画会跟踪屏幕上的滚动变化或列表首次附加时的情况,从而以不同的过渡规则来动画化列表项。

动画方向

你可以通过更改列表的 ScrollDirection 来定义这些动画的方向(Axis)。

示例代码

以下是一个完整的示例代码,展示了如何使用 shaky_animated_listview 插件来实现不同类型的动画效果。

主文件 main.dart

import 'package:flutter/material.dart';
import 'package:shaky_animated_listview/scroll_animator.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData.dark(),
      home: const Body(),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            btn1(context, "显示网格动画", () {
              buildBottomBody(context);
            }),
            btn1(context, "垂直列表动画", () {
              Navigator.of(context).push(MaterialPageRoute(builder: (context) {
                return const VerticalList();
              }));
            }),
            btn1(context, "垂直网格动画", () {
              Navigator.of(context).push(MaterialPageRoute(builder: (context) {
                return const GridList();
              }));
            }),
            btn1(context, "水平列表动画", () {
              Navigator.of(context).push(MaterialPageRoute(builder: (context) {
                return const HorzList();
              }));
            }),
          ],
        ),
      ),
    );
  }

  Widget btn1(BuildContext context, String text, Function() click) {
    return MaterialButton(
      color: Colors.grey[900],
      minWidth: 300,
      onPressed: click,
      child: Text(text),
    );
  }

  void buildBottomBody(BuildContext context) {
    showModalBottomSheet(
      context: context,
      isScrollControlled: true,
      builder: (BuildContext innerContext) {
        return Container(
          height: MediaQuery.of(innerContext).size.height,
          padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 30),
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(20),
          ),
          child: Column(
            children: <Widget>[
              buildHeader(),
              Expanded(
                child: GridView.count(
                  crossAxisCount: 3,
                  children: List.generate(9, (i) => buildImage()).toList(),
                ),
              )
            ],
          ),
        );
      },
    );
  }
}

Widget buildImage() {
  return GridAnimatorWidget(
    child: Padding(
      padding: const EdgeInsets.all(4),
      child: ClipRRect(
        borderRadius: const BorderRadius.all(Radius.circular(10)),
        child: Container(
          color: Colors.grey,
        ),
      ),
    ),
  );
}

Widget buildHeader() {
  return Padding(
    padding: const EdgeInsets.all(4),
    child: ClipRRect(
      borderRadius: const BorderRadius.all(Radius.circular(10)),
      child: Container(
        width: double.infinity,
        height: 150,
        color: Colors.black38,
        child: const Center(
          child: Text(
            "网格动画",
            style: TextStyle(fontSize: 30, color: Colors.white),
          ),
        ),
      ),
    ),
  );
}

垂直列表动画 VerticalList.dart

import 'package:flutter/material.dart';
import 'package:shaky_animated_listview/scroll_animator.dart';

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('垂直列表动画')),
      body: AnimatedListView(
        duration: 100,
        extendedSpaceBetween: 30,
        spaceBetween: 10,
        children: List.generate(
          21,
          (index) => Card(
            elevation: 50,
            margin: const EdgeInsets.symmetric(horizontal: 20),
            shadowColor: Colors.black,
            color: Colors.grey,
            child: SizedBox(
              height: 300,
              child: Padding(
                padding: const EdgeInsets.all(20.0),
                child: Column(
                  children: [
                    CircleAvatar(
                      backgroundColor: Colors.blue[500],
                      radius: 60,
                      child: const CircleAvatar(
                        backgroundImage: NetworkImage(
                            "https://avatars.githubusercontent.com/u/30810111?v=4"),
                        radius: 50,
                      ),
                    ),
                    const SizedBox(height: 10),
                    const Text(
                      '向下滚动开始',
                      style: TextStyle(
                        fontSize: 30,
                        color: Colors.blue[900],
                        fontWeight: FontWeight.w500,
                      ),
                    ),
                    const SizedBox(height: 10),
                    const Text(
                      '列表动画演示',
                      style: TextStyle(fontSize: 15, color: Colors.white),
                    ),
                    const SizedBox(height: 10),
                  ],
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

垂直网格动画 GridList.dart

import 'package:flutter/material.dart';
import 'package:shaky_animated_listview/scroll_animator.dart';

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('垂直网格动画')),
      body: AnimatedGridView(
        duration: 100,
        crossAxisCount: 2,
        mainAxisExtent: 256,
        crossAxisSpacing: 8,
        mainAxisSpacing: 8,
        children: List.generate(
          21,
          (index) => Card(
            elevation: 50,
            shadowColor: Colors.black,
            color: Colors.grey[700],
            child: SizedBox(
              width: double.infinity,
              child: Padding(
                padding: const EdgeInsets.all(20.0),
                child: Column(
                  children: const [
                    CircleAvatar(
                      backgroundColor: Colors.black,
                      radius: 60,
                      child: CircleAvatar(
                        backgroundImage: NetworkImage(
                            "https://avatars.githubusercontent.com/u/30810111?v=4"),
                        radius: 50,
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

水平列表动画 HorzList.dart

import 'package:flutter/material.dart';
import 'package:shaky_animated_listview/scroll_animator.dart';

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('水平列表动画')),
      body: AnimatedListView(
        duration: 100,
        scrollDirection: Axis.horizontal,
        children: List.generate(
          21,
          (index) => const Card(
            elevation: 50,
            margin: EdgeInsets.symmetric(horizontal: 10),
            shadowColor: Colors.black,
            color: Colors.grey,
            child: SizedBox(
              height: 300,
              width: 200,
            ),
          ),
        ),
      ),
    );
  }
}

总结

通过以上示例代码,你可以看到如何使用 shaky_animated_listview 插件来实现不同类型的列表和网格视图滚动动画。希望这些示例对你有所帮助!如果你有任何问题或建议,欢迎随时提出。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用shaky_animated_listview插件的示例代码。shaky_animated_listview是一个允许你创建带有摇晃动画效果的列表视图的插件。

首先,你需要在你的pubspec.yaml文件中添加该插件的依赖项:

dependencies:
  flutter:
    sdk: flutter
  shaky_animated_listview: ^最新版本号 # 请替换为最新版本号

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

接下来,在你的Dart文件中,你可以像这样使用ShakyAnimatedListView

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

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    List<String> items = List<String>.generate(20, (i) => "Item ${i + 1}");

    return Scaffold(
      appBar: AppBar(
        title: Text('Shaky Animated ListView Demo'),
      ),
      body: ShakyAnimatedListView(
        itemCount: items.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(items[index]),
          );
        },
        shakeAxis: Axis.vertical, // 你可以设置为 Axis.horizontal 或 Axis.vertical
        shakeIntensity: 10.0, // 摇晃强度
        shakeDuration: 1000, // 摇晃持续时间,以毫秒为单位
        shakeAnimationCurve: Curves.easeInOut, // 摇晃动画曲线
      ),
    );
  }
}

解释

  1. 添加依赖项

    • pubspec.yaml文件中添加shaky_animated_listview依赖项。
  2. 创建主应用

    • 使用MaterialApp来创建主应用。
    • 定义一个MyApp类,它是StatelessWidget的子类。
  3. 创建主页

    • 定义一个MyHomePage类,它也是StatelessWidget的子类。
    • MyHomePagebuild方法中,创建一个包含AppBarbodyScaffold
  4. 创建摇晃动画列表

    • 使用ShakyAnimatedListView来创建摇晃动画列表。
    • itemCount:列表中的项目数。
    • itemBuilder:构建每个列表项的回调。
    • shakeAxis:摇晃的轴(垂直或水平)。
    • shakeIntensity:摇晃的强度。
    • shakeDuration:摇晃动画的持续时间。
    • shakeAnimationCurve:摇晃动画的曲线。

通过这段代码,你可以在你的Flutter应用中实现一个带有摇晃动画效果的列表视图。你可以根据需要调整摇晃的参数,以实现不同的视觉效果。

回到顶部