在可见性(消失)之后快速动画,然后是可见性(可见)

时间:2012-10-17 00:24:57

标签: android

我有一个ImageView用于显示一些帧动画。 这些图像的持续时间都设置为100。

但是,有时需要隐藏ImageView。因此,动画停止,ImageView设置为GONE。

当再次显示ImageView时,其可见性设置为VISIBLE并且动画已启动。

但是 - 现在动画真的很快;而不是100的持续时间,它看起来像50.但当我检查持续时间它仍然说100 - 但它肯定不是它。

隐藏和显示ImageView的代码如下:

    //hide the animation
    final AnimationDrawable frameAnim = (AnimationDrawable) animImgView.getBackground();
    if (frameAnim.isRunning() == true)
    {
        frameAnim.stop();
    }

    frameAnim.setVisible(false, false);
    animImgView.setVisibility(View.GONE);




    //show animation
    animImgView.setVisibility(View.VISIBLE);

    final AnimationDrawable frameAnim = (AnimationDrawable) animImgView.getBackground();
    frameAnim.setVisible(true, true);
    frameAnim.start();

可能是什么麻烦?

3 个答案:

答案 0 :(得分:3)

经过一些实验,我发现最好的方法是简单地实现:

//hide the animation
animImgView.setVisibility(View.GONE);


//show animation
animImgView.setVisibility(View.VISIBLE);

这将保持动画速度。动画停止/启动的最初意图是确保CPU没有超出需要的时间。

答案 1 :(得分:0)

实现最初的目标,不仅要改变可见性,还要在不可见时停止动画:

//hide the animation
animImgView.setVisibility(View.GONE);

//stop animation
final AnimationDrawable frameAnim = (AnimationDrawable) animImgView.getBackground();
if (frameAnim.isRunning() == true)
{
    frameAnim.stop();
}

frameAnim.setVisible(false, false);



//start animation
final AnimationDrawable frameAnim = (AnimationDrawable)  animImgView.getBackground();
frameAnim.setVisible(true, true);
frameAnim.start();

//show animation
animImgView.setVisibility(View.VISIBLE);

这里的不同之处在于,当ImageView不可见/消失时,会启动和停止动画。出于某种原因,当动画可见时启动和停止动画会导致计时问题。

来源:我自己遇到了这个问题并使用这种技术修复了它。

答案 2 :(得分:0)

在Android上苦苦挣扎我找到了下一个解决方案:

不要使用start()和stop()方法。

使用setVisible(true,true)开始动画:

animImgView.setVisibility(View.VISIBLE);
final AnimationDrawable frameAnim = (AnimationDrawable) animImgView.getBackground();
frameAnim.setVisible(true, true);

和setVisible(false, true )来阻止它(请注意粗体 true ):

final AnimationDrawable frameAnim = (AnimationDrawable) animImgView.getBackground();
frameAnim.setVisible(false, true);
animImgView.setVisibility(View.GONE);