Flutter emojies的颤振动画
请观看小视频以便清楚地理解 我有一个Flitter应用程序,它以表情符号为图像,背景是一个圆形容器,我想让表情符号弹出一点动画,然后在再次点击时恢复正常 我有下面的代码,这是简单的设计没有关于动画的想法,所以我正在寻求帮助Flutter emojies的颤振动画,flutter,flutter-animation,Flutter,Flutter Animation,请观看小视频以便清楚地理解 我有一个Flitter应用程序,它以表情符号为图像,背景是一个圆形容器,我想让表情符号弹出一点动画,然后在再次点击时恢复正常 我有下面的代码,这是简单的设计没有关于动画的想法,所以我正在寻求帮助 Container( height: 90, child: ListView( scrollDirection: Axis.horizontal, children:
Container(
height: 90,
child: ListView(
scrollDirection: Axis.horizontal,
children: [
Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
children: [
Container(
width: 60.0,
height: 60.0,
child: Center(
child: Container(
width: 40.0,
height: 40.0,
child: Image.asset('assets/love.png'))),
decoration: BoxDecoration(
color: Color(0xFFF9EAD3),
shape: BoxShape.circle,
/* image: DecorationImage(
image: AssetImage('assets/emoji1.png',),
)*/
),
// child:
),
SizedBox(height: 2,),
Text('Love',style: TextStyle(color: textcolor,fontSize: 14,fontFamily: medium),),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
children: [
Container(
width: 60.0,
height: 60.0,
child: Center(
child: Container(
width: 40.0,
height: 40.0,
child: Image.asset('assets/happy.png'))),
decoration: BoxDecoration(
color: Color(0xFFF9EAD3),
shape: BoxShape.circle,
/* image: DecorationImage(
image: AssetImage('assets/emoji1.png',),
)*/
),
// child:
),
SizedBox(height: 2,),
Text('Happy',style: TextStyle(color: textcolor,fontSize: 14,fontFamily: medium),),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
children: [
Container(
width: 60.0,
height: 60.0,
child: Center(
child: Container(
width: 40.0,
height: 40.0,
child: Image.asset('assets/sad.png'))),
decoration: BoxDecoration(
color: Color(0xFFF9EAD3),
shape: BoxShape.circle,
/* image: DecorationImage(
image: AssetImage('assets/emoji1.png',),
)*/
),
// child:
),
SizedBox(height: 2,),
Text('Sad',style: TextStyle(color: textcolor,fontSize: 14,fontFamily: medium),),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
children: [
Container(
width: 60.0,
height: 60.0,
child: Center(
child: Container(
width: 40.0,
height: 40.0,
child: Image.asset('assets/depressed.png'))),
decoration: BoxDecoration(
color: Color(0xFFF9EAD3),
shape: BoxShape.circle,
/* image: DecorationImage(
image: AssetImage('assets/emoji1.png',),
)*/
),
// child:
),
SizedBox(height: 2,),
Text('Depressed',style: TextStyle(color: textcolor,fontSize: 14,fontFamily: medium),),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
children: [
Container(
width: 60.0,
height: 60.0,
child: Center(
child: Container(
width: 40.0,
height: 40.0,
child: Image.asset('assets/worried.png'))),
decoration: BoxDecoration(
color: Color(0xFFF9EAD3),
shape: BoxShape.circle,
/* image: DecorationImage(
image: AssetImage('assets/emoji1.png',),
)*/
),
// child:
),
SizedBox(height: 2,),
Text('Worried',style: TextStyle(color: textcolor,fontSize: 14,fontFamily: medium),),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
children: [
Container(
width: 60.0,
height: 60.0,
child: Center(
child: Container(
width: 40.0,
height: 40.0,
child: Image.asset('assets/confused.png'))),
decoration: BoxDecoration(
color: Color(0xFFF9EAD3),
shape: BoxShape.circle,
/* image: DecorationImage(
image: AssetImage('assets/emoji1.png',),
)*/
),
// child:
),
SizedBox(height: 2,),
Text('Confused',style: TextStyle(color: textcolor,fontSize: 14,fontFamily: medium),),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
children: [
Container(
width: 60.0,
height: 60.0,
child: Center(
child: Container(
width: 40.0,
height: 40.0,
child: Image.asset('assets/irritated.png'))),
decoration: BoxDecoration(
color: Color(0xFFF9EAD3),
shape: BoxShape.circle,
/* image: DecorationImage(
image: AssetImage('assets/emoji1.png',),
)*/
),
// child:
),
SizedBox(height: 2,),
Text('Irritated',style: TextStyle(color: textcolor,fontSize: 14,fontFamily: medium),),
],
),
),
],
),
),
你可以这样做
GestureDetector(
onTap:(){
setState((){
isTap=!isTap;
});
},
child: Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
children: [
Container(
width: 60.0,
height: 60.0,
child: Center(
child: AnimatedContainer(
duration:Duration(milliseconds:100),
width:isTap? 40.0:20,
height:isTap? 40.0:20,
child: Image.network('assets/irritated.png'))),
decoration: BoxDecoration(
color: Color(0xFFF9EAD3),
shape: BoxShape.circle,
),
),
SizedBox(height: 2,),
Text('Love',),
],
),
));
我们可以再提高一点。我们可以创建EmojiItem小部件,通过在主小部件中创建选定的索引变量来管理动画
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
int? selectedIndex;
List<String> imagePathList = ['assets/happy.png', 'assets/happy.png'];
@override
Widget build(BuildContext context) {
return ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemCount: 2,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
setState(() {
selectedIndex = selectedIndex != index ? index : null;
});
},
child: EmojiItem(
isSelected: index == selectedIndex,
imagePath: imagePathList[index],
));
});
}
}
class EmojiItem extends StatelessWidget {
final bool isSelected;
final String imagePath;
EmojiItem({Key? key, required this.isSelected, required this.imagePath}) : super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
child: Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
children: [
Container(
width: 60.0,
height: 60.0,
child: Center(
child: AnimatedContainer(
duration: Duration(milliseconds: 100),
width: isSelected ? 40.0 : 20,
height: isSelected ? 40.0 : 20,
child: Image.asset(imagePath))),
decoration: BoxDecoration(
color: Color(0xFFF9EAD3),
shape: BoxShape.circle,
),
),
SizedBox(
height: 2,
),
Text(
'Love',
style: TextStyle(),
),
],
),
));
}
}
类MyApp扩展StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
int?选择的索引;
List imagePathList=['assets/happy.png','assets/happy.png'];
@凌驾
小部件构建(构建上下文){
返回ListView.builder(
滚动方向:轴水平,
收缩膜:对,
物品计数:2,
itemBuilder:(上下文,索引){
返回手势检测器(
onTap:(){
设置状态(){
selectedIndex=selectedIndex!=索引?索引:空;
});
},
子项:EmojiItem(
isSelected:index==selectedIndex,
imagePath:imagePathList[索引],
));
});
}
}
类EmojiItem扩展了无状态小部件{
最终选举产生;
最终字符串图像路径;
EmojiItem({Key?Key,required this.isSelected,required this.imagePath}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回手势检测器(
孩子:填充(
填充:仅限常量边集(左:10),
子:列(
儿童:[
容器(
宽度:60.0,
身高:60.0,
儿童:中心(
子:动画容器(
持续时间:持续时间(毫秒:100),
宽度:40.0:20,
身高:40.0:20,
子项:Image.asset(imagePath)),
装饰:盒子装饰(
颜色:颜色(0xFFF9EAD3),
形状:BoxShape.circle,
),
),
大小盒子(
身高:2,
),
正文(
“爱”,
样式:TextStyle(),
),
],
),
));
}
}