web-dev-qa-db-ja.com

Android ImageView Animation

イメージビューとWebビューでレイアウトを作成しました。 Webビューは、デフォルトの可視性がなくなるように設定されています。アクティビティが起動すると、最初に画像ビューが表示され、WebビューがURLの読み込みを完了すると、それ自体が表示され、画像ビューが非表示としてマークされます。

Imageviewが表示されたら、ちょっとした追加のピザッズだけのために繰り返し回転したいと思います。

以前にAndroidでアニメーションを作成したことがなく、インターネットに尋ねたときに見つかったすべての投稿が役に立たなかったため、ヘルプのためにSO 。

だからこれで始めると...

    final ImageView splash = (ImageView)findViewById(R.id.splash);

繰り返し回転アニメーションを作成してImageViewに適用するにはどうすればよいですか?

再度、感謝します!

60
cakeforcerberus

RotateAnimation を使用して、ピボットポイントを画像の中心に設定します。

RotateAnimation anim = new RotateAnimation(0f, 350f, 15f, 15f);
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE);
anim.setDuration(700);

// Start animating the image
final ImageView splash = (ImageView) findViewById(R.id.splash);
splash.startAnimation(anim);

// Later.. stop the animation
splash.setAnimation(null);
102
Christopher Orr

画像をその中心の周りに回転させる方法:

ImageView view = ... //Initialize ImageView via FindViewById or programatically

RotateAnimation anim = new RotateAnimation(0.0f, 360.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

//Setup anim with desired properties
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE); //Repeat animation indefinitely
anim.setDuration(700); //Put desired duration per anim cycle here, in milliseconds

//Start animation
view.startAnimation(anim); 
//Later on, use view.setAnimation(null) to stop it.

これにより、画像はその中心の周りを回転します(幅または高さの0.5または50%)。これは、私が持っているようにGoogleからここに来て、中心を絶対ピクセルで定義せずに中心を中心に画像を回転させたい将来の読者のために投稿しています。

50
Matt

また、単にアニメーションの回転機能を使用することもできます。これは、ImageView上で特定のアニメーションを所定の時間実行します。

Animation rotate = AnimationUtils.loadAnimation([context], R.anim.rotate_picture);
splash.startAnimation(rotate);

次に、res_/animで、rotate_pictureという名前のコンテンツを含むアニメーションXMLファイルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    Android:shareInterpolator="false">

    <rotate 
    Android:fromDegrees="0"
    Android:toDegrees="360"
    Android:duration="5000"
    Android:pivotX="50%"
    Android:pivotY="50%">
</rotate>
</set>

残念ながら、これは一度だけ実行されます。待機中にアニメーションを繰り返すには、どこかにループが必要です。少し実験して、プログラムを無限ループに陥らせたので、それへの最善の方法はわかりません。編集:クリストファーの答えは、それを適切にループさせる方法に関する情報を提供するので、個別のスレッドに関する私の悪い提案を削除します!

24
Steve Haley

1つの方法-イメージをNに分割し、毎回わずかに回転させます。 5で十分だと思います。次に、Drawableでこのようなものを作成します

<animation-list   Android:id="@+id/handimation" Android:oneshot="false" 
    xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/progress1" Android:duration="150" />
    <item Android:drawable="@drawable/progress2" Android:duration="150" />
    <item Android:drawable="@drawable/progress3" Android:duration="150" />
 </animation-list> 

コード開始

progress.setVisibility(View.VISIBLE);
AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
frameAnimation.setCallback(progress);
frameAnimation.setVisible(true, true);

コードストップ

AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
frameAnimation.stop();
frameAnimation.setCallback(null);
frameAnimation = null;
progress.setVisibility(View.GONE);

もっと ここ

11
Alex Volovoy
imgDics = (ImageView) v.findViewById(R.id.img_player_tab2_dics);
    imgDics.setOnClickListener(onPlayer2Click);
    anim = new RotateAnimation(0f, 360f,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
                            0.5f);
    anim.setInterpolator(new LinearInterpolator());
    anim.setRepeatCount(Animation.INFINITE);
    anim.setDuration(4000);

    // Start animating the image
    imgDics.startAnimation(anim);
7
son nt

要素の内部に置く:

Android:repeatCount="infinite"
5

.getWidth/2などを使用すると機能しないことがわかったので、画像のピクセル数を取得し、自分で2で割ってから、最後の2つの引数。

つまり、画像が120ピクセルx 120ピクセルの正方形で、ur xとyが60ピクセルに等しいとします。あなたのコードでは、あなたは正しいでしょう:

RotateAnimation anim = new RotateAnimation(0f, 350f, 60f, 60f);
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE);
anim.setDuration(700);

そして今、あなたの画像はその中心を中心に回転します。

3
simply_immense

検証済みコード:

imageView.setImageResource(R.drawable.ic_arrow_up);

boolean up = true;

if (!up) { 
    up = true; 
    imageView.startAnimation(animate(up)); 
} else { 
    up = false; 
    imageView.startAnimation(animate(up)); 
}

private Animation animate(boolean up) {
    Animation anim = AnimationUtils.loadAnimation(this, up ? R.anim.rotate_up : R.anim.rotate_down);
    anim.setInterpolator(new LinearInterpolator()); // for smooth animation
    return anim;
}

drawable/ic_arrow_up.xml

<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:width="24dp"
        Android:height="24dp"
        Android:viewportWidth="24.0"
        Android:viewportHeight="24.0">
    <path
        Android:fillColor="#3d3d3d"
        Android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z"/>
</vector>

anim/rotate_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:fillAfter="true"
    Android:fillEnabled="true">
    <rotate
        Android:duration="200"
        Android:fromDegrees="-180"
        Android:pivotX="50%"
        Android:pivotY="50%"
        Android:toDegrees="0" />
</set>

anim/rotate_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:fillAfter="true"
    Android:fillEnabled="true">
    <rotate
        Android:duration="200"
        Android:fromDegrees="0"
        Android:pivotX="50%"
        Android:pivotY="50%"
        Android:toDegrees="180" />
</set>
2

画像の境界をハードコードしないでください。ただ使用する:

RotateAnimation anim = new RotateAnimation( fromAngle, toAngle, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
0
nick shp