[android] 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>

먼저 이미지를 1.0에서 1.2 크기로 500ms 안에 조정해야합니다.
그런 다음 500ms 내에 다시 1.0으로 확장합니다.
사용 방법은 다음과 같습니다.

Animation firstAnimation = AnimationUtils.loadAnimation(this, R.anim.first_animation);
imgView.startAnimation(firstAnimation);

한주기를 만들고 끝납니다.
확장 된 다음 ans를 축소 한 다음 중지합니다.

의도 한대로 작동하도록하려면 어떻게해야합니까?



답변

업데이트 : 2011 년 9 월에 Android 엔지니어가이 문제를 대부분 해결했습니다. XML에서 무시되었던 속성은 이제 작동하지만,를 제외 repeatCount하고 fillEnabled는 여전히 무시됩니다 (어떤 이유로 의도적으로). 이것은 AnimationSet불행히도 반복하기가 여전히 쉽지 않다는 것을 의미합니다 .

자세한 내용은 업데이트 된 문서 의 개요를 참조하십시오 (무시되는 속성, 작동하는 속성 및 자식에게 전달되는 속성 설명). 그리고 ,, 그리고 실제로 하는 fillAfter일 에 대한 더 깊은 이해는 여기 에있는 엔지니어 (Chet Haase)의 블로그 게시물을 참조하십시오 .fillBeforefillEnabled


원래 답변

Pavel과 다른 사람들의 답변을 확장하려면 <set>태그가 엄청나게 버그가 많은 것은 사실입니다 . repeatCount다른 여러 속성을 올바르게 처리 할 수 ​​없습니다 .

처리 할 수있는 것과 처리 할 수없는 것을 파악하는 데 몇 시간을 보냈으며 여기에 버그 보고서 / 문제를 제출했습니다. 문제 17662

요약하면 (이것에 관한 것입니다 AnimationSet) :

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이 아닌 코드에서만 작동합니다.


답변

<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"
/>

불행히도 이것은 한 번에 하나의 애니메이션으로 제한됩니다.
이런 식으로 애니메이션 시퀀스를 정의 할 수 없습니다 …


답변

속성을 포함해야합니다.

android:repeatCount="infinite"

하지만 “세트”가 아닌 “스케일”애니메이션에서


답변

반복되는 애니메이션을 얻기 위해 애니메이션 리스너를 활용하고 종료시 애니메이션을 다시 호출했습니다. 이것은 브래킷이있는 애니메이션처럼 초점을 맞추는 카메라 레티 큘을 수행합니다.

다음은 애니메이션 레이아웃 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>

다음은 자바 코드입니다.

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


답변

나는 또한 같은 문제에 직면하고 있었다 .. 나는 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"/>


답변

이 코드를 시도해 볼 수 있습니다. 코드에 추가하십시오.

firstAnimation.setRepeatCount(5);

이것은 일정 시간 동안 애니메이션을 반복합니다.

firstAnimation.setRepeatCount(Animation.INFINITE);
firstAnimation.setRepeatMode(Animation.INFINITE);

애니메이션이 무기한 반복됩니다.


답변

나는 Daniel의 코드를 사용하여 애니메이션을 정확한 횟수로 표시하려고했지만 문제가있었습니다. 애니메이션이 n 번 예상했을 때 대략 n / 2 번 표시되었습니다.

그래서 Daniel의 코드를 수정했습니다.

//...
@Override
public void onAnimationEnd(Animation arg0) {
    mCurrentCount++;
    if (mCurrentCount < REPEAT_COUNT) {
        Animation anim = AnimationUtils.loadAnimation(BuzzFinderActivity.this, R.anim.crosshair_focusing);
        anim.setAnimationListener(this);
        brackets.post(new Runnable() {
            @Override
            public void run() {
                brackets.startAnimation(anim);
            }
        }
    }
}
//... 

위에 표시된 변형을 사용하면 View.post () 메서드가 이전 애니메이션과 관련된 모든 작업을 완료 한 후 새 애니메이션을 시작할 수있는 기능을 제공하기 때문에 애니메이션이 정확히 REPEAT_COUNT 번 표시됩니다.