这是我的代码(简化)
public class StockAdapter extends ArrayAdapter<Stock> implements Animator.AnimatorListener
{
//Global variable - StockAdapter adapter;
//Global varaiable - View animatingView;
View.OnTouchListener stockRowOnTouch=new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (action) {
case MotionEvent.ACTION_DOWN:
//code to get the cordintated\s
case MotionEvent.ACTION_UP:
// get the coodinates
if(row is swiped) //determined by the coordinates
{
animatingView=view;
view.animate().translationX(itemWidth).alpha(1).setDuration(500).setListener(adapter);
}
}
@Override
public void onAnimationEnd(Animator animator) {
animatingView.setTranslationX(0);
animatingView.animate().alpha(0.4f).setDuration(4000).withEndAction(new Runnable() {
@Override
public void run() {
//After the animation duration delete the stock
}
});
}
}
我想做什么
然后另一个动画运行4秒,其中视图必须
在这段时间内消失。 4秒后,我将删除该行
从列表视图中调用notifydatasetchanged()
。
我是怎么做的
对于第一个动画(将视频中的行翻译为500
毫秒)我设置了一个监听器 - StockAdapter
类
对象本身。
onAnimationEnd()
函数中我翻译了视图
回到它的原始位置然后运行淡入淡出动画但是
这次使用了withEndAction
。 发生了什么
onAnimationEnd()
函数以及对视图所做的更改
可见。withEndAction()
)和
4秒后,该行将从列表视图中删除,它就是
刷新。
在验证日志时,withEndAction()
似乎触发了onEndAnimation()
。这是某种错误吗?
注意
我查看了View,ViewPropertyAnimator和ViewRootImpl的源代码。它并不表示withEndAction再次调用相同的侦听器。如果我错了,有人可以指出我这样做的地方吗?函数调用在postDelayed()
RunQueue
类ViewRootImpl
的{{1}}方法中停止。
答案 0 :(得分:2)
您需要在onAnimationEnd()
中重置动画侦听器,以避免触发您之前在onTouchListener()
中设置的同一个侦听器。
官方文档中不清楚,但View.animate()
会尝试为您的观点重复使用相同的ViewPropertyAnimator
,包括您之前设置的听众。
下面的代码可以解决问题:
...
animatingView.animate().alpha(0.4f).setDuration(4000).setListener(null).withEndAction(...)
...
答案 1 :(得分:0)
<强>问题:强>
.setListener(adapter)
由于您在4秒后使用Animator.AnimatorListener
到animatingView's ViewPropertyAnimator
,它会执行您的withEndAction
,但之后会记住您设置为{{1}的监听器有问题的是,它会一次又一次地执行animatingView
,因为您使用相同的引用来onAnimationEnd
ViewPropertyAnimator
。
<强>溶液强>
您需要在删除行后取消animatingView
内的动画,以防止再次再次调用界面方法。
<强>样品:强>
withEndAction