当重复时,Android动画“blink”

4
在我的应用程序中,我有这个动画。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:shareInterpolator="true">

    <alpha
        android:duration="1000"
        android:startOffset="2000"
        android:fromAlpha="0"
        android:toAlpha="1"/>

    <scale
        android:duration="400"
        android:startOffset="4000"
        android:fromXScale="1"
        android:fromYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.9"
        android:toYScale="0.9"/>

    <scale
        android:duration="400"
        android:startOffset="4400"
        android:fromXScale="0.9"
        android:fromYScale="0.9"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1"
        android:toYScale="1"/>

    <alpha
        android:duration="1000"
        android:startOffset="5800"
        android:fromAlpha="1"
        android:toAlpha="0"/>

</set>

通常它会显示图像,进行“按压”手势并将其隐藏。我想要的是在无限循环中运行此动画。设置参数repeatCount没有效果。我发现的唯一方法是在动画监听器中再次启动动画。

final Animation pointerAnim = AnimationUtils.loadAnimation(this, R.anim.pointer);

pointerAnim.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(final Animation animation) {}

    @Override
    public void onAnimationEnd(final Animation animation) {
        pointerView.startAnimation(pointerAnim);
    }

    @Override
    public void onAnimationRepeat(final Animation animation) {}
});

pointerView.startAnimation(pointerAnim);

但是这里出现了我的问题。在结束和新开始动画之间,图片会出现“闪烁”(在短暂的一瞬间出现和消失),我不知道如何防止这种情况发生。使用fillAfter也没有效果。在监听器中设置适当的可见性也无效。请注意,目标API是10。
我将非常乐意听取任何建议。

1
你有查看过这个答案吗?https://dev59.com/Lm855IYBdhLWcg3wMRVW - Bruno Bieri
1
是的,我检查过了,但是没有找到对我有用的东西。我无法将所有动画合并为一个。而且尝试了许多可能的标志组合,如“fillBefore”、“fillAfter”和“fillEnabled”,也没有帮助。 - pTak
3个回答

2
这个有些棘手,但是以下的答案似乎可以避免闪烁。将动画分成两部分,并设置两个动画监听器,以便当它们各自完成时,触发另一个动画开始。代码如下: pointer_fade_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:shareInterpolator="true">

<alpha
    android:duration="1000"
    android:startOffset="2000"
    android:fromAlpha="0"
    android:toAlpha="1"/>

<scale
    android:duration="400"
    android:startOffset="4000"
    android:fromXScale="1"
    android:fromYScale="1"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="0.9"
    android:toYScale="0.9"/>
</set>

pointer_fade_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
    android:duration="400"
    android:startOffset="0"
    android:fromXScale="0.9"
    android:fromYScale="0.9"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1"
    android:toYScale="1"/>

<alpha
    android:duration="1000"
    android:startOffset="1400"
    android:fromAlpha="1"
    android:toAlpha="0"/>
</set>

然后是代码:

    final Animation pointerFadeInAnim = AnimationUtils.loadAnimation(this, R.anim.pointer_fade_in);
    final Animation pointerFadeOutAnim = AnimationUtils.loadAnimation(this, R.anim.pointer_fade_out);

    pointerFadeInAnim.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(final Animation animation) {}

        @Override
        public void onAnimationEnd(final Animation animation) {
            pointerView.startAnimation(pointerFadeOutAnim);
        }

        @Override
        public void onAnimationRepeat(final Animation animation) {}


    });
    pointerFadeOutAnim.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {}

        @Override
        public void onAnimationEnd(Animation animation) {
            pointerView.startAnimation(pointerFadeInAnim);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {}
    });

    pointerView.startAnimation(pointerFadeInAnim);

希望这对您有用!

1
我在开发的一个应用程序中也遇到了同样的问题,这个解决方案对我也起作用了。 - Jason Crosby
谢谢,你的解决方案对于提到的情况非常有效。但是我在另一个动画中遇到了同样的问题,其中我有两个“translate”动画,所以我不能将此AnimationSet分成两个独立的动画,因为动画视图在第一部分动画后会跳回原始位置。 - pTak
有趣,你能分享一下翻译动画的代码吗? - Lewis McGeary
当我为您编写答案时,我想到了一个主意。我将我的动画分成了alphatranslate + translate + alpha,而不是alpha + translatetranslate + alpha,这样它看起来就像我想要的那样。我的最后一个问题是为什么?为什么将其分成两个动画有所帮助? - pTak

0

你尝试过像以下示例中那样结合使用repeatModerepeatCount属性吗?

<scale
    android:fromXScale="0.0"
    android:toXScale="1.0"
    android:fromYScale="0.0"
    android:toYScale="1.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="2000" 
    android:repeatCount="infinite"
    android:repeatMode="restart"
    />

希望它有所帮助


但我想要重复整个动画,而不仅仅是一些部分(例如 scale)。在 XML 或代码中设置这些属性也无效。 - pTak
要尝试以编程方式实现如下操作如何: anim.reset(); // 重置初始化状态 anim.setRepeatMode(Animation.RESTART); anim.setRepeatCount(Animation.INFINITE); - Aurélien Leloup

0
也许这只是一个解决方法,在你的情况下可能不适用,但是否有可能偏移整个动画,使其从3000开始?(因此,当alpha = 1.0时)
(嗯,在经过一些思考后,我相信你不能这样做,因为alpha转换应该是对象首次出现在屏幕上时的第一个)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:shareInterpolator="true">
    <scale
        android:duration="400"
        android:startOffset="1000"
        android:fromXScale="1"
        android:fromYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.9"
        android:toYScale="0.9"/>

    <scale
        android:duration="400"
        android:startOffset="1400"
        android:fromXScale="0.9"
        android:fromYScale="0.9"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1"
        android:toYScale="1"/>

    <alpha
        android:duration="1000"
        android:startOffset="2800"
        android:fromAlpha="1"
        android:toAlpha="0"/>

    <alpha
        android:duration="1000"
        android:startOffset="5800"
        android:fromAlpha="0"
        android:toAlpha="1"/>


</set>

你把它写在括号里了。我不明白你的意思,但简单的“复制和粘贴”并不起作用。甚至整个动画都没有出现,只剩下了“闪烁”。 - pTak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接