Flutter 平移DragTableScrollableSheet上的其他元素上下移动
嗨,我必须根据Flutter 平移DragTableScrollableSheet上的其他元素上下移动,flutter,flutter-layout,flutter-animation,Flutter,Flutter Layout,Flutter Animation,嗨,我必须根据DraggableScrollableSheetDraggableScrollableSheet的拖动位置来翻译我的两个小部件(你可以把这个底部的页面想象成gmap)。我必须移动/设置动画的小部件有: Text-它需要沿着一条圆弧路径同时进行前后平移和缩放。(见预期视频) 行-它需要翻译一点然后输出。来来回回 踪迹- Textwidget适当地伸缩,但以某种奇怪的方式进行翻译。(见实际视频) 行小部件淡入淡出,但很难翻译 期望视频- 实际视频- 代码- fina
DraggableScrollableSheet
DraggableScrollableSheet的拖动位置来翻译我的两个小部件(你可以把这个底部的页面想象成gmap)。我必须移动/设置动画的小部件有:
-它需要沿着一条圆弧路径同时进行前后平移和缩放。(见预期视频)Text
-它需要翻译一点然后输出。来来回回行
widget适当地伸缩,但以某种奇怪的方式进行翻译。(见实际视频)Text
小部件淡入淡出,但很难翻译行
final Duration _animationDuration = const Duration(milliseconds: 300);
bool _isNavShown = true;
double yValue = -35.0;
void _applyEffectsOnDrag(double factor) {
print(factor);
if (factor > 0.7) {
_isNavShown = false;
} else {
_isNavShown = true;
}
}
Widget _getNavigationButtons(BuildContext ctx, bool isHidden) {
return Padding(
padding: verticalAndHorizontailPadding,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
...[1, 2, 3]
.map(
(e) => Container(
decoration: CircleStyles.navButton,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
padding: padding
decoration: decoration,
child: Icon(Icons.verified_user),
),
SizedBox(height: AppMediaQuery(ctx).appHeight(2)),
Text('block heading')
],
),
),
)
.toList()
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
decoration: BoxDecoration(gradient: Variables.circleGradient),
child: Stack(
children: [
Column(
children: [
Padding(
padding: EdgeInsets.symmetric(
horizontal: AppMediaQuery(context).appHorizontalPadding(4),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
GestureDetector(
onTap: () {
// TODO: Goto home screen
},
child: Container(
alignment: Alignment.center,
width: 32,
height: 32,
decoration: backButtonStyle,
child: const Icon(
Icons.chevron_left,
),
),
),
IconButton(icon: const Icon(Icons.more_horiz), onPressed: null),
],
),
),
TweenAnimationBuilder(
duration: _animationDuration,
curve: Curves.easeInOut,
tween: Tween<double>(begin: 0, end: !_isNavShown ? yValue : 0),
child: Padding(
padding: somePadding,
child: const Align(
alignment: Alignment.centerLeft,
child: const Text('Circles'),
),
),
builder: (_, double dy, Widget ch) {
return Transform.scale(
scale: _isNavShown ? 1 : 0.8,
child: Transform.translate(
offset: Offset(0, dy),
child: ch,
),
);
},
),
AnimatedOpacity(
duration: _animationDuration,
opacity: _isNavShown ? 1 : 0,
child: _getNavigationButtons(context, true),
),
],
),
NotificationListener<DraggableScrollableNotification>(
onNotification: (obj) {
setState(() {
return _applyEffectsOnDrag(obj.extent);
});
},
child: DraggableScrollableSheet(
initialChildSize: 0.6,
minChildSize: 0.6,
maxChildSize: 0.9,
builder: (context, ctrl) {
return Container(
decoration: CircleStyles.sheetBase,
child: ConversationList(ctrl),
);
},
),
),
],
),
),
);
}
final Duration\u animationDuration=const Duration(毫秒:300);
bool_isnavShowed=真;
双Y值=-35.0;
void\u应用效果拖动(双因素){
打印(系数);
如果(系数>0.7){
_IsnavShowed=false;
}否则{
_IsnavShowed=true;
}
}
小部件_getNavigationButtons(BuildContext ctx,bool isHidden){
返回填充(
填充:垂直和水平填充,
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
...[1, 2, 3]
.地图(
(e) =>容器(
装饰:CircleStyles.navButton,
子:列(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
容器(
填充:填充
装饰:装饰,,
子:图标(图标。已验证用户),
),
SizedBox(高度:AppMediaQuery(ctx).appHeight(2)),
文本('块标题')
],
),
),
)
托利斯先生()
],
),
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:容器(
装饰:框装饰(渐变:变量。圆形渐变),
子:堆栈(
儿童:[
纵队(
儿童:[
填充物(
填充:EdgeInsets.symmetric(
水平:AppMediaQuery(上下文).appHorizontalPadding(4),
),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
手势检测器(
onTap:(){
//TODO:转到主屏幕
},
子:容器(
对齐:对齐.center,
宽度:32,
身高:32,
装饰:后纽扣样式,
子:常量图标(
Icons.chevron_左,
),
),
),
图标按钮(图标:常量图标(图标。更多水平线),ON按下:null),
],
),
),
TweenAnimationBuilder(
持续时间:_animationDuration,
曲线:Curves.easeInOut,
tween:tween(开始:0,结束:!\u IsnavShowed?Y值:0),
孩子:填充(
填充:一些填充,
子:const Align(
对齐:alignment.centerLeft,
子项:常量文本(“圆”),
),
),
生成器:(uzy,double dy,Widget ch){
返回变换比例(
比例:所示为1:0.8,
子:Transform.translate(
偏移量:偏移量(0,dy),
孩子:ch,,
),
);
},
),
动产能力(
持续时间:_animationDuration,
不透明度:所示为?1:0,
子项:_getNavigationButtons(上下文,true),
),
],
),
通知侦听器(
通知:(obj){
设置状态(){
返回\u applyEffectsOnDrag(对象范围);
});
},
子项:DragableScrollableSheet(
初始儿童尺寸:0.6,
minChildSize:0.6,
maxChildSize:0.9,
生成器:(上下文,ctrl){
返回容器(
装饰:圆形。床底,
子:会话列表(ctrl),
);
},
),
),
],
),
),
);
}