Android动画不重复

Pav*_*nov 83 animation android

我正在尝试制作可以重复几次(或无限次)的简单动画.
好像android:repeatCount不行!
这是我的动画资源/res/anim/first_animation.xml:

<?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    android:repeatCount="infinite"
    >
    <scale
        android:interpolator="@android:anim/decelerate_interpolator"
        android:duration="500"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="1.2"
        android:toYScale="1.2"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false" />
    <scale
        android:interpolator="@android:anim/accelerate_interpolator"
        android:startOffset="500"
        android:duration="500"
        android:fromXScale="1.2"
        android:fromYScale="1.2"
        android:toXScale="1.0"
        android:toYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false" />
</set>
Run Code Online (Sandbox Code Playgroud)

首先,它应该在500毫秒内将图像从1.0尺寸缩放到1.2尺寸.
然后在500毫秒内将其缩放回1.0.
这是我如何使用它:

Animation firstAnimation = AnimationUtils.loadAnimation(this, R.anim.first_animation);
imgView.startAnimation(firstAnimation);
Run Code Online (Sandbox Code Playgroud)

它进行一个循环然后结束.
它会向上扩展,然后向下缩小然后停止.

我该如何按预期工作?

Ton*_*han 63

更新:早在2011年9月,Android工程师就解决了这个问题.在XML中忽略的属性现在的工作,与例外repeatCountfillEnabled目前仍在忽略(故意出于某种原因).这意味着AnimationSet遗憾的是重复一段时间仍然不容易.

有关详细信息,请参阅更新文档中的概述(解释忽略哪些属性,哪些属性工作以及哪些属性传递给子级).而对于什么更深的理解fillAfter,fillBeforefillEnabled实际上做,看工程师的(切特·哈泽)的博客文章关于它在这里.


原始答案

为了扩展帕维尔和其他人的答案:<set>标签是荒谬的错误.它无法正确处理repeatCount和许多其他属性.

我花了几个小时搞清楚它能够和不能处理什么,并在此处提交了错误报告/问题:问题17662

总之(这关注AnimationSets):

setRepeatCount()/ android:repeatCount

此属性(以及repeatMode)在代码或XML中不起作用.这使得重复整套动画变得困难.

setDuration()/ android:duration

在代码WORKS中的AnimationSet上设置它(覆盖子动画的所有持续时间),但不包括在XML中的标记中

setFillAfter()/ android:fillAfter

这适用于标记的代码和XML.奇怪的是,我已经让它也可以在不需要将fillEnabled设置为true的情况下工作.

setFillBefore()/ android:fillBefore

似乎在代码和XML中都没有效果/被忽略

setFillEnabled()/ android:fillEnabled

似乎在代码和XML中都没有效果/被忽略.即使没有包含fillEnabled或将fillEnabled设置为false,我仍然可以获得fillAfter工作.

setStartOffset()/ android:startOffset

这仅适用于代码而不适用于XML.


Pav*_*nov 45

我发现<set>标签在类AnimationSet中有错误的实现.
它无法正确处理repeatCount.
我们可以做的是直接在<scale>标签中设置repeatCount. 这个XML资源运行良好:


<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:duration="200"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="1.05"
    android:toYScale="1.05"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatMode="reverse"
    android:fillAfter="false"
    android:repeatCount="24"
/>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仅限于一次动画.
我们不能用这种方式定义一系列动画......


Mac*_*rte 39

您应该包含该属性

android:repeatCount="infinite"
Run Code Online (Sandbox Code Playgroud)

但在你的"规模"动画中没有"设定"


Dan*_*ofr 31

为了获得重复的动画,我使用了动画监听器,并在结束时再次调用动画.这样就可以像带有括号的动画一样聚焦相机标线.

这是动画布局xml

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

</set>
Run Code Online (Sandbox Code Playgroud)

这是java代码

 public void startAnimation() {

            View brackets = findViewById(R.id.brackets);
            brackets.setVisibility(View.VISIBLE);

            Animation anim = AnimationUtils.loadAnimation(BuzzFinderActivity.this, R.anim.crosshair_focusing);
            anim.setAnimationListener(new AnimationListener() {

                @Override
                public void onAnimationEnd(Animation arg0) {
                    Animation anim = AnimationUtils.loadAnimation(BuzzFinderActivity.this, R.anim.crosshair_focusing);
                    anim.setAnimationListener(this);
                    brackets.startAnimation(anim);

                }

                @Override
                public void onAnimationRepeat(Animation arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onAnimationStart(Animation arg0) {
                    // TODO Auto-generated method stub

                }

            });


            brackets.startAnimation(anim);
}
Run Code Online (Sandbox Code Playgroud)

  • 雅应该是正确答案.在所有设备和操作系统级别工作 (2认同)

小智 10

我也遇到了同样的问题..我在XMl文件中包含了android:repeatCount ="infinite"..现在它的工作正常......

  <translate 
           android:fromXDelta="0"
           android:toXDelta="80"
           android:duration="1000"
           android:repeatCount="infinite"   
           android:repeatMode="reverse" 
           android:pivotX="50%"
           android:pivotY="50%"                             
           android:fillAfter="true"/>
Run Code Online (Sandbox Code Playgroud)


Inf*_*ics 8

你可以尝试这个代码.在您的代码中添加,

firstAnimation.setRepeatCount(5);
Run Code Online (Sandbox Code Playgroud)

这将重复动画一段时间

firstAnimation.setRepeatCount(Animation.INFINITE);
firstAnimation.setRepeatMode(Animation.INFINITE);
Run Code Online (Sandbox Code Playgroud)

这将无限期地重复动画.

  • `repeatMode`应该是`RESTART`或`REVERSE` (4认同)
  • 根据https://code.google.com/p/android/issues/detail?id=17662,setRepeat无法正常工作 (2认同)