2012-02-22 10 views
3

カスタムビューをプログラムでアニメーション化したいと考えています。私はそれがxmlファイルで宣言されている位置でのみアニメーション化したいので、レイアウトを混乱させたくありません。また、このアニメーションは他の要因の影響を受けますので、アンドロイドアニメーションクラスは問題ありません。カスタムビュー(ImageView)をプログラムでアニメーション化するにはどうすればよいですか?

私はこのサンプルをテストしましたtutorialとこれを見てくださいvideos。私の問題は、ほとんどのチュートリアルは、スプライトの位置をトレースするキャンバスにスプライトをアニメートすることです。

レイアウトに影響を与えずに、またAndroid Animationクラスを使用せずにカスタムビューをアニメーション化するにはどうすればよいですか?

編集: カスタムビューはアニメーションGIFとして動作し、イベントがアクティブになるたびに別のフレームセットを切り替えます。

+0

何をしたいですか?どのようにアニメーション化したいですか? – Blundell

+0

アニメーションはローディングバーのように、時間に関して実行されますが、イベントが発生したときに別のアニメーションセットがそのビューで再生されます。アニメーションはカスタムビューにのみ影響する必要があります。 – Marl

+1

AnimationDrawableを使用すると、次の呼び出しを行うと別のフレームセットに簡単に切り替えることができます:rocketImage.setBackgroundResource(R.drawable。<< Some other animation-list >>);あなたが必要なときに。 – auval

答えて

3

アニメーションGIFのように「実行」する「フレームごと」のアニメーションを作成する場合は、次のようにします。 drawable-animation official tutorial

チュートリアルからの引用:あなたはたとえば以下の

でき

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="true"> 
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" /> 
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" /> 
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" /> 
</animation-list> 

とあなたのコード

AnimationDrawable rocketAnimation; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image); 
    rocketImage.setBackgroundResource(R.drawable.rocket_thrust); 
    rocketAnimation = (AnimationDrawable) rocketImage.getBackground(); 
} 

public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
    rocketAnimation.start(); 
    return true; 
    } 
    return super.onTouchEvent(event); 
} 
+0

AnimationDrawableクラスが必要です。ありがとう。 – Marl

5

にアニメーションのXMLを作成することができますし、あなたのImageViewのチェックにプログラムからそのアニメーションを適用しますカスタマイズされたビューのアニメーションを開始するだけでviewobject.startAnimation(animationobject);

animation.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" 
android:shareInterpolator="false"> 
<scale 
    android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
    android:fromXScale="1.0" 
    android:toXScale="1.4" 
    android:fromYScale="1.0" 
    android:toYScale="0.6" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:fillAfter="false" 
    android:duration="700" /> 
<set 
    android:interpolator="@android:anim/accelerate_interpolator" 
    android:startOffset="700"> 
    <scale 
     android:fromXScale="1.4" 
     android:toXScale="0.0" 
     android:fromYScale="0.6" 
     android:toYScale="0.0" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:duration="400" /> 
    <rotate 
     android:fromDegrees="0" 
     android:toDegrees="-45" 
     android:toYScale="0.0" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:duration="400" /> 
</set> 

あなたmain.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/hello" 
/> 
<ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView> 

</LinearLayout> 

、あなたのアクティビティクラスmyActivity.java

public class myActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ImageView image = (ImageView) findViewById(R.id.ImageView01); 

    //create animation class object 
    Animation hyperspaceJump = 
     AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); 
    //start animation for image 
    image.startAnimation(hyperspaceJump); 
} 
} 
関連する問題