[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)의 블로그 게시물을 참조하십시오 .fillBefore
fillEnabled
원래 답변
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 번 표시됩니다.