Flutter页面折叠动画插件paperfold的使用

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

Flutter页面折叠动画插件paperfold的使用

paperfold 是一个提供页面折叠效果的Flutter插件。它允许你选择水平或垂直折叠方向,并且至少需要两个折叠条带。

安装

首先,在你的 pubspec.yaml 文件中添加 paperfold 作为依赖项:

dependencies:
  flutter:
    sdk: flutter
  paperfold: ^最新版本号

或者在终端中运行以下命令来添加依赖:

flutter pub add paperfold

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

使用方法

PaperFold widget 添加到你的 widget 树中即可实现折叠效果。下面是一个完整的示例代码,展示了如何使用 paperfold 插件。

示例代码

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

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

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

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

class MyAppState extends State<MyApp> {
  var foldSliderValue = 1.0;
  var splitsSliderValue = 2.0;
  var mainAxis = PaperFoldMainAxis.horizontal;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter paper fold',
      home: Builder(builder: (context) {
        final pixelRatio = MediaQuery.of(context).devicePixelRatio;
        return Scaffold(
          backgroundColor: Colors.red,
          body: SafeArea(
            child: Padding(
              padding: const EdgeInsets.all(20),
              child: Column(
                children: [
                  _getContent(pixelRatio),
                  Align(
                    alignment: Alignment.topRight,
                    child: _getContent(pixelRatio),
                  ),
                  Align(
                    alignment: Alignment.topLeft,
                    child: _getContent(pixelRatio),
                  ),
                  Slider(
                    value: foldSliderValue,
                    min: 0,
                    max: 1,
                    divisions: 100,
                    label: foldSliderValue.toString(),
                    onChanged: (double value) {
                      setState(() {
                        foldSliderValue = value;
                      });
                    },
                  ),
                  Slider(
                    value: splitsSliderValue,
                    min: 2,
                    max: 10,
                    divisions: 10,
                    label: splitsSliderValue.round().toString(),
                    onChanged: (double value) {
                      setState(() {
                        splitsSliderValue = value;
                      });
                    },
                  ),
                  Row(
                    children: [
                      const Text("MainAxis: HORIZONTAL"),
                      Checkbox(
                        value: mainAxis == PaperFoldMainAxis.horizontal,
                        onChanged: (value) {
                          setState(() {
                            if (mainAxis == PaperFoldMainAxis.horizontal) {
                              mainAxis = PaperFoldMainAxis.vertical;
                            } else {
                              mainAxis = PaperFoldMainAxis.horizontal;
                            }
                          });
                        },
                      ),
                    ],
                  )
                ],
              ),
            ),
          ),
        );
      }),
    );
  }

  Widget _getContent(double pixelRatio) {
    return PaperFold(
      mainAxis: mainAxis,
      strips: splitsSliderValue.round(),
      foldValue: foldSliderValue,
      pixelRatio: pixelRatio,
      child: ClipRRect(
        borderRadius: const BorderRadius.all(Radius.circular(20)),
        child: Container(
          color: Colors.green,
          height: 150,
          child: ListView.builder(
            itemCount: 30,
            itemBuilder: (context, index) {
              return const Column(
                children: [
                  Row(
                    children: [
                      Icon(
                        Icons.translate,
                        size: 50,
                      ),
                      Text("hello world, hello world")
                    ],
                  ),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}

限制

  • 用户交互(手势等)仅在展开状态(0 <= fold value < 1)下可用。
  • 子部件不能被动画化。这同样适用于视频内容。你可以用 paperfold 包裹它,但在折叠状态下内容不会更新。

问题反馈

如果有任何问题、错误或功能请求,请随时在 GitHub Issues 提交。

许可证

该插件遵循 BSD-3-Clause 许可证。

希望这个指南能帮助你在Flutter项目中成功实现页面折叠动画!如果有任何疑问或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是如何在Flutter应用中使用paperfold插件来实现页面折叠动画的示例代码。paperfold是一个流行的Flutter插件,它允许你创建类似于纸张折叠的动画效果。

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

dependencies:
  flutter:
    sdk: flutter
  paperfold: ^1.0.0  # 请检查最新版本号

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

接下来,下面是一个简单的示例,展示了如何使用Paperfold小部件来创建折叠动画效果:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 1),
      vsync: this,
    )..repeat(reverse: true);

    _animation = Tween<double>(begin: 0.0, end: 1.0).animate(_controller);
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Paperfold Example'),
      ),
      body: Center(
        child: Paperfold(
          animation: _animation,
          frontWidget: Container(
            color: Colors.blue,
            child: Center(
              child: Text(
                'Front Side',
                style: TextStyle(color: Colors.white, fontSize: 24),
              ),
            ),
          ),
          backWidget: Container(
            color: Colors.green,
            child: Center(
              child: Text(
                'Back Side',
                style: TextStyle(color: Colors.white, fontSize: 24),
              ),
            ),
          ),
          flipAxis: Axis.vertical,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // Reset the animation controller to trigger the fold animation again
          _controller.reset();
          _controller.forward();
        },
        tooltip: 'Flip',
        child: Icon(Icons.flip),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个Paperfold小部件。Paperfold小部件有两个主要属性:frontWidgetbackWidget,分别表示折叠动画的前面和后面。此外,animation属性控制动画的进度。

_controller是一个AnimationController,用于控制动画的时长和重复行为。_animation是一个Animation<double>对象,它从0.0变化到1.0,表示动画的进度。

floatingActionButton中,我们添加了一个按钮,当用户点击按钮时,动画控制器会被重置并向前播放,从而触发折叠动画。

请注意,paperfold插件的具体API可能会随着版本的更新而有所变化,因此建议查阅最新的官方文档以获取最准确的信息。

回到顶部