web-dev-qa-db-ja.com

'RotateDrawable'を使用するにはどうすればよいですか?

コードまたはXML、あるいはその両方からのものであるかどうかにかかわらず、「RotateDrawable」がどのように機能するようになったかを誰かに教えてもらえますか? Drawablesのアニメーションに関するドキュメントはかなり貧弱で、アニメーションは画像に対してのみ機能するようです。すべてのドローアブルをアニメーション化できるようにしたいと思います。 XMLからRotateDrawbleを取得しようとすると、例外が発生します。 XMLからRotateDrawableを見つけるための正しい関数は何ですか?

どうもありがとう

ケルブ

17
Kerry

「level」プロパティをアニメーション化する必要があります。ここで、0は開始値、10000は終了値です。

以下の例では、最初から最後までアニメーションを作成しています。この方法を使用すると、アニメーションを簡単に反転できます。

final RotateDrawable rotateDrawable = ...
ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000).start();
10

ImageViewで進行状況アイコンをアニメーション化する完全な例を追加したいと思います。これはMarkHetheringtonの回答に基づいています。

したがって、私のアニメーションは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
                 Android:pivotX="50%"
                 Android:pivotY="50%"
                 Android:fromDegrees="0"
                 Android:toDegrees="-360"
                 Android:duration="100"
                 Android:drawable="@drawable/ic_loop_black_24dp"
    />

アイコンは https://material.io/icons/ から来ています

次に、私のレイアウトには次のようにImageViewが含まれています。

        <ImageView
            Android:id="@+id/progress"
            Android:layout_marginTop="0dp"
            Android:layout_marginLeft="-3dp"
            Android:layout_width="30dp"
            Android:layout_height="30dp"

            Android:visibility="gone"
            Android:scaleType="fitCenter"
            Android:background="@drawable/progress_anim"
            Android:layout_gravity="center_horizontal|center_vertical"
            />

そして最後に、アニメーションを表示する必要がある場合のコードでは、次のようにします。

    RotateDrawable rotateDrawable = ((RotateDrawable)progressImage.getBackground());
    ObjectAnimator anim = ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000);
    anim.setDuration(1000);
    anim.setRepeatCount(ValueAnimator.INFINITE);
    anim.start();
4
marcinj

RotateDrawableはアニメーション化されていないようです。代わりに、setLevelを使用してドローアブルの回転を変更する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:drawable="@drawable/your_drawable"
    Android:fromDegrees="0"
    Android:pivotX="50%"
    Android:pivotY="50%"
    Android:toDegrees="360" />

そして、レベルを設定すると、ドローアブルが回転します。

final ImageView image = (ImageView)findViewById(R.id.imageView1);
final RotateDrawable drawable = (RotateDrawable)image.getDrawable();
drawable.setLevel(500);
4
Carson Reinke

次のコードは、別のDrawableをプログラムで回転させるDrawableラッパーを返します。

Drawable rotateDrawable(Drawable d, final float angle) {
    // Use LayerDrawable, because it's simpler than RotateDrawable.
    Drawable[] arD = {
        d
    };
    return new LayerDrawable(arD) {
        @Override
        public void draw(Canvas canvas) {
            canvas.save();
            canvas.rotate(angle);
            super.draw(canvas);
            canvas.restore();
        }
    };
}
3
Adam Gawne-Cain

RotateDrawableを使用したことはありませんが、グラフィックの回転をアニメーション化するだけの場合は、必要ありません。 RotateDrawableのような「レベル」を持つDrawableは、ビューをアニメーション化するのではなく、情報を伝達することを目的としています。

次のコードは、ImageViewをその中心を中心に回転させます。

ImageView myImageView = (ImageView)findViewById(R.id.my_imageview);

AnimationSet animSet = new AnimationSet(true);
animSet.setInterpolator(new DecelerateInterpolator());
animSet.setFillAfter(true);
animSet.setFillEnabled(true);

final RotateAnimation animRotate = new RotateAnimation(0.0f, -90.0f,
    RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
    RotateAnimation.RELATIVE_TO_SELF, 0.5f);

animRotate.setDuration(1500);
animRotate.setFillAfter(true);
animSet.addAnimation(animRotate);

myImageView.startAnimation(animSet);
2

これは良い実例です。パラメータ期間は、アニメーション化するために使用されます。

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="4000"
    Android:fromDegrees="0"
    Android:pivotX="50%"
    Android:pivotY="50%"
    Android:toDegrees="720" >

    <shape
        Android:innerRadius="20dp"
        Android:shape="ring"
        Android:thickness="4dp"
        Android:useLevel="false" >
        <size
            Android:height="48dp"
            Android:width="48dp" />

        <gradient
            Android:centerY="0.5"
            Android:endColor="@Android:color/white"
            Android:startColor="#00ffffff"
            Android:type="sweep"
            Android:useLevel="false" />
    </shape>

</rotate>
2
RexSplode

RotatedDrawable.setLevel()を手動で呼び出してドローアブルを回転させるか、ProgressBarのコードを読み取ることができます。不確定なドローアブルは、次のように子がRotatedDrawableであるLayerDrawableです。

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <rotate
             Android:drawable="@drawable/spinner_48_outer_holo"
             Android:pivotX="50%"
             Android:pivotY="50%"
             Android:fromDegrees="0"
             Android:toDegrees="1080" />
    </item>
    <item>
        <rotate
             Android:drawable="@drawable/spinner_48_inner_holo"
             Android:pivotX="50%"
             Android:pivotY="50%"
             Android:fromDegrees="720"
             Android:toDegrees="0" />
    </item>
</layer-list>

回転アニメーションは、ProgressBarのonDrawメソッドによって駆動されました。

1
liuyong