Dart 颤振-小部件中的部分幻灯片转换
我正在尝试创建下面的动画,其中在Dart 颤振-小部件中的部分幻灯片转换,dart,flutter,Dart,Flutter,我正在尝试创建下面的动画,其中在容器后面有一个小部件 我试图使用类Dismissible,但它的动画不会在某个点停止,它会随着项目结束而消失,根据下面的gif: 我将代码插入到SlideTransition类中,但我不确定如何将onHorizontalDragStart,onHorizontalDragUpdate,OnHorizontalDragen与隐藏的小部件集成以生成预期效果 你能帮我解决这个问题吗 在屏幕上显示以下代码: 导入“包装:颤振/材料.省道”; void main(){
容器
后面有一个小部件
我试图使用类Dismissible
,但它的动画不会在某个点停止,它会随着项目结束而消失,根据下面的gif:
我将代码插入到SlideTransition
类中,但我不确定如何将onHorizontalDragStart
,onHorizontalDragUpdate
,OnHorizontalDragen
与隐藏的小部件集成以生成预期效果
你能帮我解决这个问题吗
在屏幕上显示以下代码:
导入“包装:颤振/材料.省道”;
void main(){
runApp(新的MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState使用TickerProviderStateMixin扩展状态{
动画控制器_控制器;
动画(动画),;
bool_dragUnderway=false;
@凌驾
void initState(){
_控制器=新的AnimationController(
vsync:这个,,
持续时间:常数持续时间(毫秒:200),
);
_动画=新曲线动画(
父节点:_控制器,
曲线:新间隔(0.0,1.0,曲线:曲线。线性),
);
_controller.reverse();
super.initState();
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(),
正文:新中心(
儿童:新的手势检测器(
//onHorizontalDragStart:,
//onHorizontalDragUpdate:,
//在水平方向:,
子:新幻灯片转换(
职位:新吐温(
开始:Offset.zero,
结束:常数偏移(1.0,0.0),
).制作动画(_动画),
子容器:新容器(
装饰:新盒子装饰(
边界:新边界(
顶部:新的BorderSide(样式:BorderStyle.solid,颜色:Colors.black26),
底部:新的BorderSide(样式:BorderStyle.solid,颜色:Colors.black26),
)
),
填充:仅限新边缘组(顶部:20.0,底部:20.0),
孩子:新的一排(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
新文本(“foo”),
],
),
),
)
)
),
);
}
}
我找到了一个解决方案,按照下面的代码和演示进行操作:
导入“包装:颤振/材料.省道”;
void main(){
runApp(新的MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState使用TickerProviderStateMixin扩展状态{
动画控制器_控制器;
动画(动画),;
void initState(){
super.initState();
_控制器=新的AnimationController(持续时间:
常量持续时间(毫秒:246),vsync:this;
_动画=新曲线动画(
父节点:_控制器,
曲线:新间隔(0.0,1.0,曲线:曲线。线性),
);
}
无效移动(DragUpdate详细信息){
最终双增量=细节。主增量/304;
切换(上下文的方向性){
case TextDirection.rtl:
_controller.value+=delta;
打破
case TextDirection.ltr:
_controller.value-=delta;
打破
}
}
void_handleDragEnd(图纸详图){
bool_isFlingGesture=-details.velocity.pixelsPerSecond.dx>700;
如果(_isFlingGesture){
最终双flingVelocity=details.velocity.pixelsPerSecond.dx;
_控制器.fling(速度:flingVelocity.abs()*0.003333);
}否则如果(_.value<0.4){
_controller.reverse();
}否则{
_controller.forward();
}
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(),
正文:新中心(
儿童:新的手势检测器(
水平排水更新:_移动,
在水平方向上:_handleDragEnd,
子:新堆栈(
儿童:[
新定位。填充(
孩子:新的一排(
mainAxisAlignment:mainAxisAlignment.end,
儿童:[
新容器(
装饰:新盒子装饰(
颜色:颜色。黑色38,
边界:新边界(
顶部:新的BorderSide(样式:BorderStyle.solid,颜色:Colors.black12),
底部:新的BorderSide(样式:BorderStyle.solid,颜色:Colors.black12),
),
),
孩子:新的图标按钮(
填充:仅限新边集(顶部:16.0,底部:16.0,左侧:24.0,右侧:24.0),
图标:新图标(图标。拇指朝上),
颜色:新颜色(0xFFFFFF),
按下:(){},
)
),
新容器(
装饰:新盒子装饰(
颜色:颜色。黑色54,
边界:新边界(
顶部:新的BorderSide(样式:BorderStyle.solid,颜色:Colors.black12),
底部:新的BorderSide(样式:BorderStyle.solid,颜色:Colors.bla)
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
AnimationController _controller;
Animation<double> _animation;
bool _dragUnderway = false;
@override
void initState() {
_controller = new AnimationController(
vsync: this,
duration: const Duration(milliseconds: 200),
);
_animation = new CurvedAnimation(
parent: _controller,
curve: new Interval(0.0, 1.0, curve: Curves.linear),
);
_controller.reverse();
super.initState();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(),
body: new Center(
child: new GestureDetector(
//onHorizontalDragStart: ,
//onHorizontalDragUpdate:,
//onHorizontalDragEnd: ,
child: new SlideTransition(
position: new Tween<Offset>(
begin: Offset.zero,
end: const Offset(1.0, 0.0),
).animate(_animation),
child: new Container(
decoration: new BoxDecoration(
border: new Border(
top: new BorderSide(style: BorderStyle.solid, color: Colors.black26),
bottom: new BorderSide(style: BorderStyle.solid, color: Colors.black26),
)
),
padding: new EdgeInsets.only(top: 20.0, bottom: 20.0),
child: new Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
new Text('foo'),
],
),
),
)
)
),
);
}
}
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
AnimationController _controller;
Animation<double> _animation;
void initState() {
super.initState();
_controller = new AnimationController(duration:
const Duration(milliseconds: 246), vsync: this);
_animation = new CurvedAnimation(
parent: _controller,
curve: new Interval(0.0, 1.0, curve: Curves.linear),
);
}
void _move(DragUpdateDetails details) {
final double delta = details.primaryDelta / 304;
switch (Directionality.of(context)) {
case TextDirection.rtl:
_controller.value += delta;
break;
case TextDirection.ltr:
_controller.value -= delta;
break;
}
}
void _handleDragEnd(DragEndDetails details) {
bool _isFlingGesture = -details.velocity.pixelsPerSecond.dx > 700;
if (_isFlingGesture) {
final double flingVelocity = details.velocity.pixelsPerSecond.dx;
_controller.fling(velocity: flingVelocity.abs() * 0.003333);
} else if (_controller.value < 0.4) {
_controller.reverse();
} else {
_controller.forward();
}
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(),
body: new Center(
child: new GestureDetector(
onHorizontalDragUpdate: _move,
onHorizontalDragEnd: _handleDragEnd,
child: new Stack(
children: <Widget>[
new Positioned.fill(
child: new Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
new Container(
decoration: new BoxDecoration(
color: Colors.black38,
border: new Border(
top: new BorderSide(style: BorderStyle.solid, color: Colors.black12),
bottom: new BorderSide(style: BorderStyle.solid, color: Colors.black12),
),
),
child: new IconButton(
padding: new EdgeInsets.only(top: 16.0, bottom: 16.0, left: 24.0, right: 24.0),
icon: new Icon(Icons.thumb_up),
color: new Color(0xFFFFFFFF),
onPressed: () {},
)
),
new Container(
decoration: new BoxDecoration(
color: Colors.black54,
border: new Border(
top: new BorderSide(style: BorderStyle.solid, color: Colors.black12),
bottom: new BorderSide(style: BorderStyle.solid, color: Colors.black12),
),
),
child: new IconButton(
padding: new EdgeInsets.only(top: 16.0, bottom: 16.0, left: 24.0, right: 24.0),
icon: new Icon(Icons.edit),
color: new Color(0xFFFFFFFF),
onPressed: () {},
)
),
new Container(
decoration: new BoxDecoration(
color: new Color(0xFFE57373),
border: new Border(
top: new BorderSide(style: BorderStyle.solid, color: const Color(0xFFE57373)),
bottom: new BorderSide(style: BorderStyle.solid, color: const Color(0xFFE57373)),
),
),
child: new IconButton(
padding: new EdgeInsets.only(top: 16.0, bottom: 16.0, left: 24.0, right: 24.0),
icon: new Icon(Icons.delete),
color: new Color(0xFFFFFFFF),
onPressed: () {},
)
),
],
),
),
new SlideTransition(
position: new Tween<Offset>(
begin: Offset.zero,
end: const Offset(-0.6, 0.0), //controls the opening of the slice
).animate(_animation),
child: new Container(
decoration: new BoxDecoration(
border: new Border(
top: new BorderSide(style: BorderStyle.solid, color: Colors.black26),
bottom: new BorderSide(style: BorderStyle.solid, color: Colors.black26),
),
color: new Color(0xFFFFFFFF),
),
padding: new EdgeInsets.only(top: 20.0, bottom: 20.0),
child: new Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
new Text('foo'),
],
),
),
),
],
)
)
),
);
}
}