为动态数量的视图设置动画,然后将它们设置为不可见/消失

时间:2013-04-23 14:56:01

标签: android animation

在Activity中,我正在从服务器检索数据。有限数量的TableRow包含在布局xml文件中预先定义的更多视图,所有视图都设置为android:visibility="gone"。此外,java类中有一个数组,其中包含这些TableRow的所有ID。 对于每个输入“数据输入”,我填充这样的TableRow,将其设置为可见并为其设置动画(动画是从随机选择的垂直边“推入”)。作为进一步的提示,这在此问题的后期很重要,从服务器检索的每个数据包都与一个月相关。

每当我获得数据时,我都会执行以下过程

  1. 使用信息
  2. 填充仍然不可见的TableRow
  3. 每执行一次步骤1,布尔数组中的值设置为true
  4. 致电showAnimation()
  5. 对于布尔数组中为true的每个条目,在id数组中的索引TableRow处获取i,设置动画并将可见性设置为可见
  6. 这很好用。即使在开始动画之前设置了可见性,也没关系,因为这需要很少的时间,动画已经在我们的眼中开始了。

    现在出现了问题:相反的方法不起作用。让我澄清一下:我想,TableRow被推出窗外,然后设置为不可见的。每当我更改实际月份时就会消失,然后推入新条目。问题是,动画一开始,View s就会设置为不可见/消失。我尝试用AnimationListener解决这个问题,如第一个答案中解释here。这导致了两种可能的方式:

    1. 为每个AnimationListener定义一个TableRow,并在onAnimationEnd()中设置可见性。我觉得这很难看,因为它不是动态的。
    2. 可以访问AnimationListener中的某种索引,并为每个TableRow的动画设置相同的监听器。 我不知道怎么可能解决这个问题。正如我之前发现的那样,在循环中设置的View上设置动画(在我的情况下为for循环)会导致动画在循环结束时启动,而不是在设置时。因此,即使我在onAnimationEnd()中使用for循环中的全局索引变量,它显然也会一无所获。
    3. 有人知道更好的方法来实现这个吗?使用Handler.postDelayed()解决它并不起作用,因为新数据可能已经来自服务器,因此新条目已经可见(因此新条目设置为不可见)。

1 个答案:

答案 0 :(得分:1)

好吧我想了很多,老实说我同意你的看法,这不是最好的方式,但由于框架限制,第一种方式仍然是最好的方式。

如果我们能够从收听者回电中做到这一点会很好:

public void onAnimationEnd (Animation animation){
    animation.getView().setVisibility(View.Visible);
}
// but this doesn't exist.

每次设置动画时都要确保开始:

Animation anim = row.getAnimation()
if(anim!=null){
     anim.setListener(null); // to avoid the listener to be called
     anim.cancel(); // to stop it from running
}
// and then go ahead and setup a new animation with new listener
anim = new MyAnimation();
anim.setListener(new SetToInvisibleListener());
row.startAnimation(anim);