Flutter页面转换效果插件another_transformer_page_view的使用

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

Flutter页面转换效果插件another_transformer_page_view的使用

another_transformer_page_view 是一个用于Flutter的插件,提供了一系列丰富的页面切换动画效果。它继承自 transformer_page_view,并在此基础上进行了优化和扩展。

Very simple to use

要使用此插件非常简单,只需在 pubspec.yaml 文件中添加依赖:

dependencies:
  another_transformer_page_view: ^latest_version # 替换为最新版本号

然后运行以下命令来获取包:

flutter packages get

接下来就可以在代码中使用 TransformerPageView 组件了。例如:

import 'package:another_transformer_page_view/another_transformer_page_view.dart';

...

new TransformerPageView(
  loop: true,
  transformer: new AccordionTransformer(),
  itemBuilder: (BuildContext context, int index) {
    return new Container(
      color: list[index % list.length],
      child: new Center(
        child: new Text(
          "$index",
          style: new TextStyle(fontSize: 80.0, color: Colors.white),
        ),
      ),
    );
  },
  itemCount: 3,
);

几乎与 PageView.builder 的用法相同,只需要指定一个 transformer 参数给 TransformerPageView,该参数是一个 PageTransformer 的子类。

Show cases

以下是几种常见的页面转换效果示例:

  • Parallax
  • Basic(如AccordionTransformer):
  • ThreeDTransformer
  • ScaleAndFadeTransformer
  • ZoomInPageTransformer
  • ZoomOutPageTransformer
  • DepthPageTransformer

每个效果的具体实现可以参考相应的GitHub链接。

Getting Started

Installation

  1. 在项目的 pubspec.yaml 文件中添加依赖:
    dependencies:
      another_transformer_page_view: ^latest_version # 替换为最新版本号
    
  2. 运行命令以获取包:
    flutter packages get
    

Basic Usage

TransformerPageView 的基本参数如下表所示:

Parameter Default Description
scrollDirection Axis.horizontal 如果是 Axis.horizontal,则子项水平排列;否则垂直排列。
loop false 设置为 true 可启用无限循环模式。
index none 初始显示的页索引。如果不设置,则由组件自身控制;否则由外部控件通过 itemBuilder 控制。
onPageChanged void onPageChanged(int) 当用户滑动时调用,传递新的索引值。
duration Duration(milliseconds:300) 每次切换动画持续的时间。
transformer none 最重要的属性,返回基于传入组件变换后的组件。如果为 null,必须指定 itemBuilder
itemCount none 总项目数。
itemBuilder none 根据索引返回组件的函数。如果为 null,必须指定 transformer

Build-in Parallax

提供了三种内置的视差效果处理方式:

  • ParallaxColor:处理颜色渐变。
  • ParallaxImage:处理图片,速度比 PageView 慢。
  • ParallaxContainer:处理文本或其他元素,速度比 PageView 快。

这些视差效果都可以在 PageTransformer 的子类中组合使用,创建出酷炫的效果。

Custom animation

除了内置的转换效果外,还可以自定义动画。可以通过继承 PageTransformer 类来自定义所需的页面切换效果。

示例代码

这里给出一个完整的示例代码,展示了如何在一个简单的Flutter应用中集成 TransformerPageView,并且能够动态选择不同的页面转换效果:

import 'dart:math' as math;
import 'package:another_transformer_page_view/another_transformer_page_view.dart';
import 'package:flutter/material.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(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, this.title}) : super(key: key);

  final String? title;

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

class _MyHomePageState extends State<MyHomePage> {
  IndexController? _controller;
  final List<String> _types = [
    'AccordionTransformer',
    'ThreeDTransformer',
    'ScaleAndFadeTransformer',
    'ZoomInPageTransformer',
    'ZoomOutPageTransformer',
    'DeepthPageTransformer'
  ];

  String? _type = 'AccordionTransformer';
  FixedExtentScrollController? controller;
  int? _index = 0;
  double _viewportFraction = 1.0;

  @override
  void initState() {
    _controller = IndexController();
    controller = FixedExtentScrollController();
    super.initState();
  }

  PageTransformer getTransformer() {
    switch (_type) {
      case 'AccordionTransformer':
        return AccordionTransformer();
      case 'ThreeDTransformer':
        return ThreeDTransformer();
      case 'ScaleAndFadeTransformer':
        return ScaleAndFadeTransformer();
      case 'ZoomInPageTransformer':
        return ZoomInPageTransformer();
      case 'ZoomOutPageTransformer':
        return ZoomOutPageTransformer();
      case 'DeepthPageTransformer':
        return DepthPageTransformer();
      default:
        throw Exception('Not a type');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: Column(
        children: <Widget>[
          Wrap(
            children: <Widget>[
              ElevatedButton(
                onPressed: () {
                  _controller!.move(math.Random().nextInt(5));
                },
                child: const Text('Random'),
              ),
              ElevatedButton(
                onPressed: () {
                  Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (b) {
                        return Scaffold(
                          appBar: AppBar(
                            title: const Text('images'),
                          ),
                          body: ImageTest(),
                        );
                      },
                    ),
                  );
                },
                child: const Text('Image'),
              ),
              ElevatedButton(
                onPressed: () {
                  Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (b) {
                        return Scaffold(
                          appBar: AppBar(
                            title: const Text('welcome'),
                          ),
                          body: Welcome(0),
                        );
                      },
                    ),
                  );
                },
                child: const Text('Welcome'),
              ),
              ElevatedButton(
                onPressed: () {
                  Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (b) {
                        return const Zero();
                      },
                    ),
                  );
                },
                child: const Text('Zero'),
              ),
            ],
          ),
          Row(
            children: <Widget>[
              ElevatedButton(
                onPressed: () {
                  _controller!.previous();
                },
                child: const Text('Previous'),
              ),
              const SizedBox(width: 8.0),
              ElevatedButton(
                onPressed: () {
                  _controller!.next();
                },
                child: const Text('Next'),
              ),
              const SizedBox(width: 8.0),
              ElevatedButton(
                onPressed: () {
                  showModalBottomSheet(
                    context: context,
                    builder: (_) {
                      return CupertinoPicker(
                        scrollController: controller,
                        itemExtent: 30.0,
                        onSelectedItemChanged: (int index) {
                          setState(() {
                            controller = FixedExtentScrollController(initialItem: index);
                            _type = _types[index];
                            if (_type == 'ScaleAndFadeTransformer') {
                              _viewportFraction = 0.8;
                            } else {
                              _viewportFraction = 1.0;
                            }
                          });
                        },
                        children: _types.map((t) => Text(t)).toList(),
                      );
                    },
                  );
                },
                child: const Text('Change Animation'),
              ),
            ],
          ),
          Expanded(
            child: TransformerPageView(
              index: _index,
              viewportFraction: _viewportFraction,
              controller: _controller,
              transformer: getTransformer(),
              onPageChanged: (int? index) {
                setState(() {
                  _index = index;
                });
              },
              itemBuilder: (BuildContext context, int index) {
                // 注意这里的 images 需要在实际项目中替换为自己的资源路径
                return Image.asset(
                  'assets/image_$index.jpg', // 假设你有三张图片命名为 image_0.jpg, image_1.jpg, image_2.jpg
                  fit: BoxFit.fill,
                );
              },
              itemCount: 3,
            ),
          )
        ],
      ),
    );
  }
}

这段代码创建了一个包含多种页面切换效果的应用程序,并允许用户通过底部弹出的选择器来改变当前使用的动画类型。同时,还提供了前后翻页按钮以及随机跳转的功能。

希望这篇文档能帮助您更好地理解和使用 another_transformer_page_view 插件!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是如何在Flutter项目中使用another_transformer_page_view插件来实现页面转换效果的示例代码。another_transformer_page_view插件提供了多种页面转换动画,可以使你的应用更加生动和有趣。

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

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

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

接下来是一个完整的示例代码,展示了如何使用another_transformer_page_view

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<Color> colors = [Colors.red, Colors.green, Colors.blue, Colors.yellow];
  int currentPage = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Another Transformer Page View Demo'),
      ),
      body: Center(
        child: AnotherTransformerPageView(
          pageTransformer: CubePageTransformer(), // 你可以使用其他Transformer,比如 DepthPageTransformer, ZoomPageTransformer 等
          controller: PageController(initialPage: currentPage),
          onPageChanged: (int page) {
            setState(() {
              currentPage = page;
            });
          },
          children: List.generate(
            colors.length,
            (index) => Container(
              color: colors[index],
              child: Center(
                child: Text(
                  'Page ${index + 1}',
                  style: TextStyle(color: Colors.white, fontSize: 24),
                ),
              ),
            ),
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          final PageController controller = PageController.of(context);
          controller.nextPage(
            duration: const Duration(milliseconds: 500),
            curve: Curves.easeInOut,
          );
        },
        tooltip: 'Next Page',
        child: Icon(Icons.navigate_next),
      ),
    );
  }
}

在这个示例中:

  1. 我们定义了一个包含几种颜色的列表,每个颜色代表一个页面。
  2. 使用AnotherTransformerPageView来创建页面视图,并设置pageTransformer属性为CubePageTransformer(你可以根据需要更改为其他转换效果,如DepthPageTransformerZoomPageTransformer)。
  3. PageController用于控制页面切换,并在页面改变时更新当前页面索引。
  4. 每个页面都是一个带有中心文本的容器,文本显示当前页面的编号。
  5. 一个浮动操作按钮(FAB)用于切换到下一个页面。

这个示例展示了如何使用another_transformer_page_view插件实现页面转换效果,你可以根据需要进一步自定义和扩展。

回到顶部