我对颤动很陌生,我正在尝试在 PageView 上做一些动画。准确地说,我想动画删除一个项目。
我尝试了几种方法来制作动画,除了解决方案之外,你们解决此类问题的方式也将有助于我的颤振技巧。
到目前为止我已经尝试过:
- 动画填充和不透明度
- 问题在于,当我在 onLongPress 的 setState 中设置填充时,它会重建小部件,并使用活动或非活动 CardPadding 再次覆盖填充(我认为)
- 动画宽度和高度
- 我似乎无法让这两个值都起作用
- 在 PageViewController 上动画 viewportFraction
- 不知道该怎么做,以及是否可以仅针对特定的“页面”执行此操作
下面是我迄今为止编写的(精简的)代码。
class Main extends StatefulWidget {
@override
_MainState createState() => _MainState();
}
class _MainState extends State<Main> {
int activeCard = 0;
EdgeInsets inActiveCardPadding = EdgeInsets.symmetric(vertical: 120.0, horizontal: 20.0);
EdgeInsets activeCardPadding = EdgeInsets.symmetric(vertical: 105.0, horizontal: 10.0);
PageController pageController = PageController(
initialPage: 0,
viewportFraction: 0.8,
);
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Stack(
children: <Widget>[
PageView.builder(
itemCount: PlantCareApp.plants.length,
controller: pageController,
onPageChanged: (activeCardIndex) {
setState(() {
this.activeCard = activeCardIndex;
});
},
itemBuilder: (context, cardIndex) {
return AnimatedContainer(
padding: (activeCard == cardIndex) ? activeCardPadding : inActiveCardPadding;,
duration: Duration(milliseconds: 250),
child: PlantCard(
PlantCareApp.plants[cardIndex],
onTap: () {
Navigator.pushNamed(context, PlantDetailScreen.route, arguments: PlantCareApp.plants[cardIndex]);
},
onLongPress: () {
setState(() {
//
// ANIMATE OR TRIGGER ANIMATION HERE
//
// do the actual removing
/*
PlantCareApp.plants[cardIndex].remove(); // remove from db
PlantCareApp.plants.removeAt(cardIndex); // remove from List
*/
});
//PlantCareApp.plants[cardIndex].remove();
},
),
);
},
),
],
),
),
);
}
}
任何帮助将不胜感激!你们将如何解决这样的问题,或者您将如何解决这个特定的用例。
我想实际上动画 viewportFraction 将是最好的,因为相邻的“页面”也会相互移动?
谢谢!