withEndAction()触发onEndAnimation()函数?

时间:2014-08-22 19:02:17

标签: android listview

这是我的代码(简化)

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


            }
        });
}
}

我想做什么

  1. 当一行被刷得足够远时,就会完成一个动画 在500毫秒内翻译出窗口。
  2. 在该持续时间之后,行(视图)再次被转换回 窗口和一些更改将进入视图。
  3. 然后另一个动画运行4秒,其中视图必须 在这段时间内消失。 4秒后,我将删除该行 从列表视图中调用notifydatasetchanged()



    我是怎么做的

  4. 对于第一个动画(将视频中的行翻译为500 毫秒)我设置了一个监听器 - StockAdapter类 对象本身。

  5. 然后在onAnimationEnd()函数中我翻译了视图 回到它的原始位置然后运行淡入淡出动画但是 这次使用了withEndAction

  6. 发生了什么

    1. 在滑动时,第一个动画完美运行并进入 onAnimationEnd()函数以及对视图所做的更改 可见。
    2. 然后淡入淡出动画也开始运行(withEndAction())和 4秒后,该行将从列表视图中删除,它就是 刷新。
    3. 现在这个动画一直在运行,直到没有数据放在那个位置


    4. 在验证日志时,withEndAction()似乎触发了onEndAnimation()。这是某种错误吗?

      注意

      我查看了ViewViewPropertyAnimatorViewRootImpl的源代码。它并不表示withEndAction再次调用相同的侦听器。如果我错了,有人可以指出我这样做的地方吗?函数调用在postDelayed() RunQueueViewRootImpl的{​​{1}}方法中停止。

2 个答案:

答案 0 :(得分:2)

您需要在onAnimationEnd()中重置动画侦听器,以避免触发您之前在onTouchListener()中设置的同一个侦听器。 官方文档中不清楚,但View.animate()会尝试为您的观点重复使用相同的ViewPropertyAnimator,包括您之前设置的听众。

下面的代码可以解决问题:

...
animatingView.animate().alpha(0.4f).setDuration(4000).setListener(null).withEndAction(...)
...

答案 1 :(得分:0)

<强>问题:

.setListener(adapter)

由于您在4秒后使用Animator.AnimatorListeneranimatingView's ViewPropertyAnimator,它会执行您的withEndAction ,但之后会记住您设置为{{1}的监听器有问题的是,它会一次又一次地执行animatingView,因为您使用相同的引用onAnimationEnd ViewPropertyAnimator

<强>溶液

您需要在删除行后取消animatingView内的动画,以防止再次再次调用界面方法

<强>样品:

withEndAction