Flutter视图收缩动画插件shrinking_view的使用
Flutter视图收缩动画插件shrinking_view的使用
shrinking_view
是一个轻量且高度可定制的Flutter插件,用于程序化地收缩和扩展视图/屏幕/小部件。它类似于iOS中前台内容背后的页面缩小效果,主要用于包裹 Scaffold
小部件。
功能
- 收缩和扩展视图/屏幕/小部件。
- 通过
ShrinkingViewController
控制。 - 只需几行代码即可实现。
GIF演示
使用步骤
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();
}
注意:确保您的类使用了 SingleTickerProviderStateMixin
或 TickerProviderStateMixin
,以便可以将 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
更多关于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),
),
),
),
);
}
}
在这个示例中,我们做了以下几件事:
- 引入依赖:确保在
pubspec.yaml
中添加了shrinking_view
依赖项。 - 创建主应用:
MyApp
是我们的主应用类,它包含一个MaterialApp
和一个Scaffold
,其中包含一个AppBar
和一个Center
居中的MyShrinkingView
。 - 创建收缩视图组件:
MyShrinkingView
是一个有状态的组件,它使用SingleTickerProviderStateMixin
来管理动画控制器。 - 初始化动画控制器:在
initState
方法中,我们创建了一个AnimationController
和一个Tween
动画,动画的持续时间设置为2秒,并设置动画在播放完毕后自动反向播放。 - 构建收缩视图:在
build
方法中,我们使用ShrinkingView
组件,并将动画和子组件(一个带有文本的蓝色容器)传递给ShrinkingView
。
运行这个示例代码,你会看到一个蓝色的容器在2秒内从正常大小收缩到原来大小的一半,并自动反向播放动画。
希望这个示例对你有帮助!如果你有任何其他问题,请随时提问。