class CoinAnimationItem extends StatefulWidget {
final Offset startOffset, endOffset;///開始結(jié)束位置
final Function(LandAllModel allModel)? onTap;///點(diǎn)擊金幣回調(diào) 可調(diào)用回收接口
final LandAllModel allModel;///所需數(shù)據(jù)
const CoinAnimationItem(this.allModel, this.endOffset, this.startOffset, {super.key, this.onTap});
@override
State<StatefulWidget> createState() {
return CoinAnimationItemState();
}
}
class CoinAnimationItemState extends State<CoinAnimationItem> with SingleTickerProviderStateMixin {
double top = 0;
double left = 0;
AnimationController? _controller;
Animation? _animation;
///是否結(jié)束潜腻,如果結(jié)束就消失整個(gè)coinAnimationItem
bool finish = false;
///默認(rèn)顯示小手苞轿,點(diǎn)擊瞬間小手消失,只有果實(shí)動(dòng)畫
bool begin = false;
///開始動(dòng)畫只動(dòng)一次
forwardAction() {
_controller?.forward();
}
@override
void initState() {
// TODO: implement initState
super.initState();
_controller = AnimationController(duration: const Duration(milliseconds: 1000), vsync: this);
_animation = Tween(begin: 0, end: 1.0).animate(_controller!)
..addListener(() {
if (_animation?.value > 0.99) {
_controller?.stop();
finish = true;
}
if (_animation?.value > 0.01) {
begin = true;
}
setState(() {});
})
..addStatusListener((AnimationStatus status) {
if (status == AnimationStatus.completed) {
_controller?.stop();
}
});
}
@override
void dispose() {
_controller?.dispose();
_animation = null;
_controller = null;
super.dispose();
}
@override
Widget build(BuildContext context) {
// 1. about start
var startX = widget.startOffset.dx;
var startY = widget.startOffset.dy;
// 2. about end
var endX = widget.endOffset.dx;
var endY = widget.endOffset.dy;
// 3. calculate
var x = startX + (endX - startX) * _animation?.value;
var y = startY + (endY - startY) * _animation?.value;
top = y;
left = x;
return warpString(widget.allModel.member_mill?.can_receive) == "1"
// return (!CommonUtils.isEmpty(widget.allModel.member_mill?.id))
? Positioned(
top: top,
left: left,
child: (finish == false)
? TextButton(
onPressed: () {
widget.onTap?.call(widget.allModel);
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Stack(
alignment: Alignment.centerLeft,
children: [
Container(
decoration: BoxDecoration(
color: AppColors.white.withAlpha(100),
borderRadius: const BorderRadius.all(Radius.circular(90)),
border: Border.all(color: AppColors.yellow, width: 1.w),
),
padding: EdgeInsets.only(left: 20.w, right: 5.w, top: 1.w, bottom: 1.w),
child: Center(
child: Row(
children: [
NoneText(
widget.allModel.member_mill?.receive_amount,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: AppColors.mainColor, fontSize: 11.sp, fontWeight: FontWeight.bold),
),
],
),
),
),
Image.asset(
"images/g1.png",
width: 18.w,
height: 18.w,
fit: BoxFit.cover,
),
],
),
if (begin == false)
Image.asset(
"images/keshouhuo.png",
width: 40.w,
// height: width ?? 98.w,
),
],
),
)
: const SizedBox(),
)
: const SizedBox();
}
}
使用方法
CoinAnimationItem(
landList[2],
Offset(40.w, 10.w),
Offset(36.w, 165.w),
onTap: (model) {
//調(diào)用接口
},
key: guoshiAnimationItemStateList[2],
),
326441734681763_.pic.jpg