そのため、アクティビティが作成されたらすぐにアニメーションを開始したいのですが、何らかの理由で、何をしようとしてもアニメーションが開始されます。クリックイベントを設定することで開始できますが、すべてを単独で開始したいと思います。
これが私が持っているものであり、これをどのように機能させるのですか?
package tween.learn;
import Android.app.Activity;
import Android.graphics.drawable.AnimationDrawable;
import Android.os.Bundle;
import Android.widget.ImageView;
public class Animate extends Activity {
public ImageView image;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView tweenImage = (ImageView) findViewById(R.id.imageView1);
tweenImage.setBackgroundResource(R.anim.cubicfacetween);
AnimationDrawable frameAnimation =
(AnimationDrawable) tweenImage.getBackground();
frameAnimation.start();
}
}
ありがとう
問題のビューの初期化が完了した後、アニメーションを開始する必要があると思います。次のようなことができるはずです。
final ImageView tweenImage = (ImageView) findViewById(R.id.imageView1);
tweenImage.setBackgroundResource(R.anim.cubicfacetween);
tweenImage.post(new Runnable() {
@Override
public void run() {
AnimationDrawable frameAnimation =
(AnimationDrawable) tweenImage.getBackground();
frameAnimation.start();
}
}
編集-この質問により、onWindowFocusChanged
メソッドが常に機能するとは限らないと私は信じました。それはより単純に見えます、そしてそれがあなたのために働くならばおそらくより良い考えです。
私はこれが古い質問であることを知っています、しかし私は同じ問題を抱えていました、しかし答えは私を助けませんでした。何時間もかけて作業した後、私はついに私の問題がimageviewコンテナにAndroid:src="@drawable/myanimation"
を追加したことであることに気付きました。これを削除すると、上記の回答が機能しました。アニメーションは実行されていたと思いますが、srcを設定すると、アニメーションの最初の画像がその上に表示されたため、再生されていないと思いました。
Android:src
が定義されていないイメージビューがあり、非表示に設定されていますonCreate
で、imageviewを表示に設定し、setBackgroundResource
をXMLファイルに記述されているアニメーションに設定しました。onWindowFocusChanged
アニメーションを開始します。アニメーションが表示されているときにアニメーションを再生するための私のソリューション。それはあなたが(xmlレイアウトで)宣言して忘れさせてくれます。
class AnimatedImageView extends ImageView {
// required constructors omitted for clarity
private void updateAnimationsState() {
boolean running = getVisibility() == View.VISIBLE && hasWindowFocus();
updateAnimationState(getDrawable(), running);
updateAnimationState(getBackground(), running);
}
private void updateAnimationState(Drawable drawable, boolean running) {
if(drawable instanceof AnimationDrawable) {
AnimationDrawable animationDrawable = (AnimationDrawable) drawable;
if(running) {
animationDrawable.start();
} else {
animationDrawable.stop();
}
}
}
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
updateAnimationsState();
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
updateAnimationsState();
}
}
コードからドローアブルを設定する場合は、適切なset *()メソッドをオーバーライドし、そこからupdateAnimationsState()を呼び出す必要があります。
アクティビティでonWindowFocusChangedをオーバーライドして、ウィンドウがフォーカスを取得した後にアニメーションを開始してみてください。
@Override
public void onWindowFocusChanged (boolean hasFocus)
{
//Start animation here
}
こちらのドキュメントを参照してください: http://developer.Android.com/reference/Android/app/Activity.html#onWindowFocusChanged%28boolean%29
もう1つの解決策:
animationDrawable.stop()
メソッドを呼び出す前に、start()
を呼び出します。
上記の回答 で説明したようにアニメーションを開始したいときに、setBackgroundResource
ではなくsetImageResource
を呼び出すことでこの問題を修正しました。
private AnimationDrawable animationDrawable;
fab.setImageResource(R.drawable.animation);
animationDrawable = (AnimationDrawable) fab.getDrawable();
fab.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
fab.setBackgroundResource(R.drawable.animation);
animationDrawable.start();
}
});
注:アニメーションをリセットするには、
animationDrawable.selectDrawable(0);//animation drawable used here is collection of images
animationDrawable.stop();