[英]How to make page turning effect in flutter?
我想創建像翻頁這樣的動畫,這更可能是一張在中心彎曲的加硬卡片,同時在顫動中翻頁,但我只能讓它像下面這樣的平面卡片一樣翻轉動畫。
但是我需要在中心做一些曲率,讓它感覺像翻一本很長的相冊,我怎么能在那里做曲率。
我試過的是
import 'dart:math';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flip Animation Example'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool _showFrontSide;
bool _flipXAxis;
@override
void initState() {
super.initState();
_showFrontSide = true;
_flipXAxis = true;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(this.widget.title),
centerTitle: true,
actions: [
IconButton(
icon: RotatedBox(
child: Icon(Icons.flip),
quarterTurns: _flipXAxis ? 0 : 1,
),
onPressed: _changeRotationAxis,
),
],
),
body: DefaultTextStyle(
style: TextStyle(color: Colors.white),
textAlign: TextAlign.center,
child: Center(
child: Container(
constraints: BoxConstraints.tight(Size.square(200.0)),
child: _buildFlipAnimation(),
),
),
),
);
}
void _changeRotationAxis() {
setState(() {
_flipXAxis = !_flipXAxis;
});
}
void _switchCard() {
setState(() {
_showFrontSide = !_showFrontSide;
});
}
Widget _buildFlipAnimation() {
return GestureDetector(
onTap: _switchCard,
child: AnimatedSwitcher(
duration: Duration(milliseconds: 800),
transitionBuilder: __transitionBuilder,
layoutBuilder: (widget, list) => Stack(children: [widget, ...list]),
child: _showFrontSide ? _buildFront() : _buildRear(),
switchInCurve: Curves.easeInBack,
switchOutCurve: Curves.easeInBack.flipped,
),
);
}
Widget __transitionBuilder(Widget widget, Animation<double> animation) {
final rotateAnim = Tween(begin: pi, end: 0.0).animate(animation);
return AnimatedBuilder(
animation: rotateAnim,
child: widget,
builder: (context, widget) {
final isUnder = (ValueKey(_showFrontSide) != widget.key);
var tilt = ((animation.value - 0.5).abs() - 0.5) * 0.003;
tilt *= isUnder ? -1.0 : 1.0;
final value = isUnder ? min(rotateAnim.value, pi / 2) : rotateAnim.value;
return Transform(
transform: _flipXAxis
? (Matrix4.rotationY(value)..setEntry(3, 0, tilt))
: (Matrix4.rotationX(value)..setEntry(3, 1, tilt)),
child: widget,
alignment: Alignment.center,
);
},
);
}
Widget _buildFront() {
return __buildLayout(
key: ValueKey(true),
backgroundColor: Colors.blue,
faceName: "Front",
child: Padding(
padding: EdgeInsets.all(32.0),
child: ColorFiltered(
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcATop),
child: FlutterLogo(),
),
),
);
}
Widget _buildRear() {
return __buildLayout(
key: ValueKey(false),
backgroundColor: Colors.blue.shade700,
faceName: "Rear",
child: Padding(
padding: EdgeInsets.all(20.0),
child: ColorFiltered(
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcATop),
child: Center(child: Text("Flutter", style: TextStyle(fontSize: 50.0))),
),
),
);
}
Widget __buildLayout({Key key, Widget child, String faceName, Color backgroundColor}) {
return Container(
key: key,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(20.0),
color: backgroundColor,
),
child: Center(
child: Text(faceName.substring(0, 1), style: TextStyle(fontSize: 80.0)),
),
);
}
}
嘗試
https://pub.dev/packages/page_turn這是來自 flutter 社區的舊版本 或者
https://pub.dev/packages/better_page_turn這是來自更好播放器的同一開發商的新產品
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.