https://shapeshifter.design/ を使用してAnimatedVectorDrawablesをいじっています。取得したエクスポートファイルは以下のとおりです。私の研究では、アニメーションをループするには、Android:repeatCount = "infinite"およびAndroid:repeatMode = "restart"objectAnimatorに。
これをobjectAnimatorに追加すると、これらのアイテムの1つだけがシリーズから繰り返されます。 一連のアニメーション全体をどのようにループしますか?アニメーションをロード時に開始して繰り返します。
<animated-vector
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:aapt="http://schemas.Android.com/aapt">
<aapt:attr name="Android:drawable">
<vector
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:width="50dp"
Android:height="50dp"
Android:viewportWidth="50"
Android:viewportHeight="50">
<path
Android:name="_x34_"
Android:pathData="M 25 12.3 L 39.7 37.7 L 10.3 37.7 Z"
Android:fillColor="#ffffff"
Android:strokeColor="#000000"
Android:strokeWidth="1"
Android:strokeLineCap="round"
Android:strokeLineJoin="round"
Android:strokeMiterLimit="10"/>
</vector>
</aapt:attr>
<target Android:name="_x34_">
<aapt:attr name="Android:animation">
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<objectAnimator
Android:propertyName="pathData"
Android:duration="1000"
Android:valueFrom="M 25 12.3 L 39.7 37.7 L 10.3 37.7 L 17.397 25.437 Z"
Android:valueTo="M 10 10 L 40 10 L 40 40 L 10 40 Z"
Android:valueType="pathType"
Android:interpolator="@Android:anim/overshoot_interpolator"/>
<objectAnimator
Android:propertyName="pathData"
Android:startOffset="1000"
Android:duration="1000"
Android:valueFrom="M 40 10 L 25.581 10 L 10 10 L 10 40 L 25.349 40 L 40 40 L 40 10"
Android:valueTo="M 36.3 18.7 L 25 10.4 L 13.7 18.7 L 12.8 31.5 L 25 39.6 L 37.2 31.5 L 36.3 18.7"
Android:valueType="pathType"
Android:interpolator="@Android:interpolator/fast_out_slow_in"/>
<objectAnimator
Android:propertyName="pathData"
Android:startOffset="2000"
Android:duration="1000"
Android:valueFrom="M 36.3 18.7 L 25 10.4 L 13.7 18.7 L 12.8 31.5 L 25 39.6 L 37.2 31.5 Z"
Android:valueTo="M 25 10.2 L 12.2 17.6 L 12.2 32.4 L 25 39.8 L 37.8 32.4 L 37.8 17.6 Z"
Android:valueType="pathType"
Android:interpolator="@Android:anim/overshoot_interpolator"/>
<objectAnimator
Android:propertyName="pathData"
Android:startOffset="3000"
Android:duration="1000"
Android:valueFrom="M 31.365 13.88 L 25 10.2 L 18.268 14.092 L 12.2 17.6 L 12.2 25.465 L 12.2 32.4 L 25 39.8 L 37.8 32.4 L 37.8 25.581 L 37.8 17.6 L 31.365 13.88"
Android:valueTo="M 33.7 13 L 25 10.2 L 16.3 13 L 10.9 20.4 L 10.9 29.6 L 16.3 37 L 25 39.8 L 33.7 37 L 39.1 29.6 L 39.1 20.4 L 33.7 13"
Android:valueType="pathType"
Android:interpolator="@Android:anim/decelerate_interpolator"/>
<objectAnimator
Android:propertyName="pathData"
Android:startOffset="4000"
Android:duration="1000"
Android:valueFrom="M 39.1 20.4 L 33.7 13 L 25 10.2 L 16.3 13 L 10.9 20.4 L 10.9 29.6 L 16.3 37 L 25 39.8 L 33.7 37 L 39.1 29.6 L 39.1 20.4"
Android:valueTo="M 39.7 20 L 32.199 16.173 L 25 12.5 L 17.885 16.13 L 10.3 20 L 10 31 L 16.994 34.031 L 25 37.5 L 32.948 34.056 L 40 31 L 39.7 20"
Android:valueType="pathType"
Android:interpolator="@Android:interpolator/fast_out_slow_in"/>
<objectAnimator
Android:propertyName="pathData"
Android:startOffset="5000"
Android:duration="1000"
Android:valueFrom="M 10.3 20 L 25 12.5 L 39.7 20 L 40 31 L 25 37.5 L 10 31 L 10.3 20"
Android:valueTo="M 17.995 24.403 L 25 12.3 L 32.23 24.792 L 39.7 37.7 L 25.581 37.7 L 10.3 37.7 L 17.995 24.403"
Android:valueType="pathType"
Android:interpolator="@Android:interpolator/fast_out_slow_in"/>
</set>
</aapt:attr>
</target>
</animated-vector>
final ImageView animationView = (ImageView) findViewById(R.id.animationView);
final AnimatedVectorDrawable drawable = (AnimatedVectorDrawable) getDrawable(R.drawable.avd_dice);
animationView.setImageDrawable(drawable);
drawable.start();
より低いAPIをサポートするには、AnimatedVectorDrawableではなくAnimatedVectorDrawableCompatを使用する必要があります。そのコールバックを記述して、終了時にアニメーションを開始することもできます。最後に、コードは次のようになります。
val animated = AnimatedVectorDrawableCompat.create(this, R.drawable.avd_dice)
animated?.registerAnimationCallback(object : Animatable2Compat.AnimationCallback() {
override fun onAnimationEnd(drawable: Drawable?) {
animationView.post { animated.start() }
}
})
animationView.setImageDrawable(animated)
animated?.start()
Animatable2.AnimationCallback を使用して、onAnimationEndで再度AnimatedVectorDrawableアニメーションを開始できます
drawable.registerAnimationCallback(new Animatable2.AnimationCallback() {
@Override
public void onAnimationEnd(Drawable drawable) {
avd.start();
}
});
drawable.start();
objectAnimatorでプロパティを使用する
Android:repeatMode="restart"
Android:repeatCount="infinite"
あなたのオブジェクトはそのようなものです
<objectAnimator
Android:propertyName="pathData"
Android:duration="1000"
Android:valueFrom="path value"
Android:valueTo="some value"
Android:valueType="pathType"
Android:repeatMode="restart"
Android:repeatCount="infinite"
Android:interpolator="@Android:anim/overshoot_interpolator"/>
@Feryal Sharifzadehの素晴らしい答えをベースとして使用して、AVDを設定およびループするためのKotlin ext関数を次に示します。
internal fun ImageView.applyLoopingAnimatedVectorDrawable(@DrawableRes avdResId: Int) {
val animated = AnimatedVectorDrawableCompat.create(context, avdResId)
animated?.registerAnimationCallback(object : Animatable2Compat.AnimationCallback() {
override fun onAnimationEnd(drawable: Drawable?) {
[email protected] { animated.start() }
}
})
this.setImageDrawable(animated)
animated?.start()
}