Android 动画 "blink" 重复时

Android animation "blink" when repeat

在我的应用程序中我有这个动画

<?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>

一般是显示图片,做"press"手势然后隐藏。我想要的是 运行 这个无限循环的动画。设置参数 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);

但是我的问题来了。在结束动画和新开始动画之间,图像 "blink"(在短时间内出现并消失),我不知道如何防止这种情况发生。使用 fillAfter 无效。在侦听器中设置适当的可见性也不起作用。请注意目标 API 是 10.

我很乐意提供任何建议

您是否尝试像下面的示例那样组合 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"
    />

希望对您有所帮助

也许这只是一种不适用于您的情况的解决方法,但是否可以偏移整个动画,使其从 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>

这出人意料地棘手,但这里有一个似乎有效并避免眨眼的答案。将动画分成两部分并设置两个动画侦听器,以便在每个完成时触发另一个开始。看起来如下:

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);

希望这对你有用!