如何在layoutAnimationController为它们设置动画时更改各个视图的可见性?

时间:2014-06-29 16:36:13

标签: android gridview layout-animation

我有一个GridView,当按下一个按钮时,我希望所有元素一次淡出一个(或淡入,如果它们已经不可见)。在最后的淡出,我有:

Animation fadeIn = AnimationUtils.loadAnimation(activity, R.anim.fade_in);
LayoutAnimationController layoutAnimationController = new LayoutAnimationController(fadeIn);
gridView.setLayoutAnimation(layoutAnimationController);
gridView.setVisibility(View.VISIBLE);

按预期工作。 GridView中的每个视图一次淡入一个,然后整个GridView可见。在淡出结束时,虽然类似的东西可能会起作用:

Animation fadeOut = AnimationUtils.loadAnimation(activity, R.anim.fade_out);
LayoutAnimationController layoutAnimationController = new LayoutAnimationController(fadeOut);
gridView.setLayoutAnimation(layoutAnimationController);
gridView.setVisibility(View.INVISIBLE);

但是,这只会使GridView立即消失,不会发生动画,它只会变得不可见。为什么是这样?我想我看到了一种扩展LayoutAnimationController的方法,其中我可以指定动画之后的可见性,但是有更简单的方法来获得我想要的淡出效果吗?

编辑:基本上,因为每个视图都使用特定的动画制作动画,我希望它将状态更改为VISIBLE或INVISIBLE,我想如果GridView的全部内容都是INVISIBLE我真的不关心GridView本身是不可见的。出于某种原因,这是我在fadeIn上的确切行为,但在fadeOut上,事情并不好,我猜测fadeIn工作只是一个愚蠢的巧合,实际上有一个更好的方式这样做。

我意识到一种方法是手动为屏幕上可见的每个视图编写所有动画,但如果这可以通过LayoutAnimationController实现,那显然要好得多。

编辑:我的问题的主旨:onButtonPressed,我希望GridView中的视图一次淡出一个,并且整个GridView在动画结束时不可见。

2 个答案:

答案 0 :(得分:0)

一旦设置了可见性,它就立即改变(好吧,一旦UI线程返回到Looper)。如果您希望它在动画后不可见,则需要在动画完成之前不设置可见性。可能会制作动画集的最后一帧就足够了。

答案 1 :(得分:0)

您需要实现AnimationListener,然后在动画完成后调用setVisibilty(View.INVISIBLE)。您必须这样做,因为在完成代码后将其设置为不可见是正常的。所以它隐藏了它的动画。

public class YourClass extends Foo implements AnimationListener {

//...

@Override
public void onAnimationEnd(Animation a) {
    // Do stuff.
    // SET INVISBLE HERE
}

@Override
public void onAnimationRepeat(Animation a) {    
}

@Override
public void onAnimationStart(Animation a) {
}

}

正如在上面提到的聊天中,您还可以在动画上添加AnimationListener,如:

fadeOut.setAnimationListener(new Animation.AnimationListener() { 
@Override 
public void onAnimationStart(Animation animation) { 

} 

@Override 
public void onAnimationEnd(Animation animation) { 

} 

@Override 
public void onAnimationRepeat(Animation animation) { 

} 
});