0

我有一个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其中我可以指定动画后的可见性,但是有没有更简单的方法来获得我想要的淡出效果?

编辑:所以基本上,当每个视图都使用特定动画进行动画处理时,我希望它将状态更改为可见或不可见,我想如果 GridView 的全部内容都是不可见的,我并不真正关心 GridView 本身是不可见的. 出于某种原因,这是我在fadeIn 上得到的确切行为,但在fadeOut 上,事情并不那么好,我猜fadeIn 的工作只是一个愚蠢的巧合,实际上有更好的方法来做到这一点。

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

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

4

2 回答 2

0

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

于 2014-06-29T16:40:17.047 回答
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) { 

} 
});
于 2014-06-29T16:44:30.097 回答