Flutter视图收缩动画插件shrinking_view的使用

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

Flutter视图收缩动画插件shrinking_view的使用

shrinking_view 是一个轻量且高度可定制的Flutter插件,用于程序化地收缩和扩展视图/屏幕/小部件。它类似于iOS中前台内容背后的页面缩小效果,主要用于包裹 Scaffold 小部件。

功能

  • 收缩和扩展视图/屏幕/小部件。
  • 通过 ShrinkingViewController 控制。
  • 只需几行代码即可实现。

GIF演示

Demo1 Demo2 Demo3 Demo4

使用步骤

1. 安装并导入包

在项目中添加 shrinking_view 包:

$ flutter pub add shrinking_view

然后导入:

import 'package:shrinking_view/shrinking_view.dart';

2. 创建 ShrinkingViewController

在您的应用程序中创建一个 ShrinkingViewController 并传递给 ShrinkingView

late ShrinkingViewController controller;

@override
void initState() {
    controller = ShrinkingViewController(tickerProvider: this);
    super.initState();
}

注意:确保您的类使用了 SingleTickerProviderStateMixinTickerProviderStateMixin,以便可以将 this 作为 TickerProvider 传递给 ShrinkingViewController

3. 包裹 Scaffold(或任何其他小部件)

将您的 Scaffold (或任何其他小部件)包裹在 ShrinkingView 中,并传递您刚刚创建的 controller

return ShrinkingView(
  controller: controller,
  child: const Scaffold(
    body: <YOUR_APP>,
  ),
);

4. 使用控制器方法控制动画

现在,您可以调用 controller.<SOME_METHOD> 来控制 ShrinkingView

ShrinkingViewController 方法

  • shrink() => void: 开始收缩动画。
  • expand() => void: 开始扩展动画。
  • isShrunk() => bool: 返回是否处于收缩状态。
  • isExpanded() => bool: 返回是否处于扩展状态。
  • isAnimating() => bool: 返回是否正在动画。
  • isShrinkingCurrently() => bool: 返回是否正在收缩。
  • isExpandingCurrently() => bool: 返回是否正在扩展。

ShrinkingView 属性

  • controller: 必填项,控制 ShrinkingView 的控制器。
  • child: 必填项,要包裹的小部件,通常是一个 Scaffold
  • 其他属性如 topLeftSquared, topRightSquared, backgroundColorWhileAnimating 等,用于自定义动画效果。

示例代码

以下是一个完整的示例,展示了如何使用 shrinking_view 包:

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

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'shrinking_view package',
      home: HomePage(),
    );
  }
}

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin {
  late ShrinkingViewController controller;

  @override
  void initState() {
    controller = ShrinkingViewController(tickerProvider: this);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return ShrinkingView(
      controller: controller,
      child: Scaffold(
        appBar: AppBar(
          title: const Text("shrinking_view example"),
        ),
        body: Center(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              TextButton(
                onPressed: () => controller.expand(),
                child: const Text("Expand (action)"),
              ),
              TextButton(
                onPressed: () => controller.shrink(),
                child: const Text("Shrink (action)"),
              ),
              TextButton(
                onPressed: () => print(controller.isShrunk()),
                child: const Text("Is shrunk? (bool)"),
              ),
              TextButton(
                onPressed: () => print(controller.isExpanded()),
                child: const Text("Is expanded? (bool)"),
              ),
              TextButton(
                onPressed: () => print(controller.isAnimating()),
                child: const Text("Is animating? (bool)"),
              ),
              TextButton(
                onPressed: () => print(controller.isShrinkingCurrently()),
                child: const Text("Is currently shrinking? (bool)"),
              ),
              TextButton(
                onPressed: () => print(controller.isExpandingCurrently()),
                child: const Text("Is currently expanding? (bool)"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

希望这个指南能帮助您快速上手 shrinking_view 插件!如果有任何问题或建议,请随时联系作者或提交Issue。


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

1 回复

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


当然,以下是如何在Flutter项目中使用shrinking_view插件来实现视图收缩动画的示例代码。

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

dependencies:
  flutter:
    sdk: flutter
  shrinking_view: ^最新版本号 # 请替换为当前最新版本号

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

接下来,下面是一个完整的示例代码,展示如何使用shrinking_view插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Shrinking View Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Shrinking View Demo'),
        ),
        body: Center(
          child: MyShrinkingView(),
        ),
      ),
    );
  }
}

class MyShrinkingView extends StatefulWidget {
  @override
  _MyShrinkingViewState createState() => _MyShrinkingViewState();
}

class _MyShrinkingViewState extends State<MyShrinkingView> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true); // 自动反向播放动画

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

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

  @override
  Widget build(BuildContext context) {
    return ShrinkingView(
      animation: _animation,
      child: Container(
        width: 200,
        height: 200,
        color: Colors.blue,
        child: Center(
          child: Text(
            'Shrinking',
            style: TextStyle(color: Colors.white, fontSize: 24),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 引入依赖:确保在pubspec.yaml中添加了shrinking_view依赖项。
  2. 创建主应用MyApp是我们的主应用类,它包含一个MaterialApp和一个Scaffold,其中包含一个AppBar和一个Center居中的MyShrinkingView
  3. 创建收缩视图组件MyShrinkingView是一个有状态的组件,它使用SingleTickerProviderStateMixin来管理动画控制器。
  4. 初始化动画控制器:在initState方法中,我们创建了一个AnimationController和一个Tween动画,动画的持续时间设置为2秒,并设置动画在播放完毕后自动反向播放。
  5. 构建收缩视图:在build方法中,我们使用ShrinkingView组件,并将动画和子组件(一个带有文本的蓝色容器)传递给ShrinkingView

运行这个示例代码,你会看到一个蓝色的容器在2秒内从正常大小收缩到原来大小的一半,并自动反向播放动画。

希望这个示例对你有帮助!如果你有任何其他问题,请随时提问。

回到顶部