1. ホーム
  2. android

[解決済み] Androidのアニメーションが繰り返されない

2023-05-15 21:17:16

質問

数回(または無限に)繰り返す簡単なアニメーションを作ろうとしています。

それは次のように思われます。 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);

1サイクルして終了します。

拡大し、縮小し、そして停止する。



どうすれば意図したとおりに動作させることができるのでしょうか?

どのように解決するのですか?

更新しました。 2011年9月、Androidエンジニアがこの問題の大部分を修正しました。XMLで無視されていた属性が動作するようになり、例外として repeatCountfillEnabled などはまだ無視されます(なぜか意図的に)。つまり、まだ AnimationSet を繰り返すのはまだ簡単ではないということです。

の概要をご覧ください。 ドキュメントを更新しました。 にある概要 (どの属性が無視され、どの属性が機能し、どれが子に渡されるかが説明されています) を参照してください。また、より深く理解するために fillAfter , fillBefore そして fillEnabled は実際に動作していますので、それに関するエンジニア (Chet Haase) のブログ記事をご覧ください。 ここで .


オリジナルの回答

Pavel さんや他の方の回答を展開すると、確かに <set> タグがとんでもなくバグだらけなのは事実です。このタグは repeatCount および他の多くの属性を正しく扱うことができません。

私は数時間を費やして、それが対処できることとできないことを把握し、ここにバグレポート/問題を提出しました。 問題 17662

要約すると(これは AnimationSet s):

setRepeatCount() / android:repeatCount

<ブロッククオート

この属性は(repeatModeと同様に)コードやXMLでは機能しません。このため、アニメーションのセット全体を繰り返すことは困難です。

setDuration() / android:duration

コード内のAnimationSetにこれを設定するとうまくいきますが(子アニメーションのすべての継続時間を上書きします)、XMLのタグに含まれる場合はそうではありません。

setFillAfter() / android:fillAfter

これはコードとタグのXMLの両方で動作します。不思議なことに、私は fillEnabled を true に設定する必要なく動作するようにしました。

setFillBefore() / android:fillBefore

コードとXMLの両方で効果がない/無視されているように見える

setFillEnabled() / android:fillEnabled

コードとXMLの両方で効果がない/無視されるようです。fillEnabled を含めず、fillEnabled を false に設定しなくても、fillAfter を動作させることができます。

setStartOffset() / android:startOffset

これはコードの中だけで動作し、XMLでは動作しません。