2010-12-28 10 views
4

私は、ボタンを押すとさまざまなフレームごとのアニメーションを再生するボタンを持つアプリケーションを持っています。アニメーションは.pngファイルのシーケンスとして保存されます。いくつかのアニメーションは小さな領域を埋めるもので、animationDrawableを使ってうまくいくように見えます。しかし、一部のアニメーションは画面の大部分を占めています(たとえアルファチャンネルを使用して透明であっても)。アプリケーションが携帯電話に読み込まれるとメモリ不足エラーが発生します(エミュレータではありません)。メイン画面をオーバーレイする必要があるため、ビデオファイルとして再生できません。アニメーションで大きなPNGフレームアニメーションを再生します.Drawable

私の主な質問 - animationDrawableを使用して、大規模なPNGシーケンスアニメーション(320x480で60フレームと言う)を再生する方法はありますか?

これまでの研究では、メモリの制限を回避する方法がないようです...私は、ImageViewを作成し、ビットマップでデータを入力してから、遅延後の各フレームのビットマップしかし、このテクニックでは、私のアニメーションは最初と最後のフレームだけを再生するようです。

アニメーションドローブを使用したときのスタブのコードは次のとおりです。「チンパンジー」はうまくいきますが、「泡」(大きな画像)を追加すると、アプリケーションがまったく読み込まれません.- logCat shows: "ERROR/dalvikvm-ヒープ(3248):このプロセスには大きすぎ1008000バイトの外部割り当て... ERROR/AndroidRuntime(3248):java.lang.OutOfMemoryErrorを:ビットマップのサイズはVMの予算 」

public class Babymode_tst extends Activity implements OnClickListener{ 
/** Called when the activity is first created. */ 
AnimationDrawable chimpAnimation; 
AnimationDrawable bubblesAnimation; 
private MediaPlayer mp; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setVolumeControlStream(AudioManager.STREAM_MUSIC); 

    final ImageButton chimpButton = (ImageButton) findViewById(R.id.chimp_button); 
    chimpButton.setOnClickListener(this); 
    ImageView chimpImage = (ImageView) findViewById(R.id.chimp_imageview); 
    chimpImage.setBackgroundResource(R.drawable.chimp_anim); 
    chimpAnimation = (AnimationDrawable) chimpImage.getBackground(); 

    final ImageButton bubblesButton = (ImageButton) findViewById(R.id.bubbles_button); 
    bubblesButton.setOnClickListener(this); 
    ImageView bubblesImage = (ImageView) findViewById(R.id.bubbles_imageview); 
    bubblesImage.setBackgroundResource(R.drawable.bubbles_anim); 
    bubblesAnimation = (AnimationDrawable) bubblesImage.getBackground(); 
} 

public void onClick(View v) { 
    if (mp != null) { 
    mp.release(); 
    } 

    Random generator = new Random(); 
    int randomIndex; 

    switch(v.getId()){ 
    case R.id.chimp_button: 
    randomIndex = (generator.nextInt(2) + 1); 
    if (randomIndex == 1){ 
    mp = MediaPlayer.create(this, R.raw.chimp_1); 
    } 
    if (randomIndex == 2){ 
    mp = MediaPlayer.create(this, R.raw.chimp_2); 
    } 
    mp.start(); 

    chimpAnimation.setVisible(true,true); 
    chimpAnimation.start(); 

    break; 

    case R.id.bubbles_button: 
    randomIndex = (generator.nextInt(3) + 1); 
    if (randomIndex == 1){ 
    mp = MediaPlayer.create(this, R.raw.bubbles_1); 
    } 
    if (randomIndex == 2){ 
    mp = MediaPlayer.create(this, R.raw.bubbles_2); 
    } 
    if (randomIndex == 3){ 
    mp = MediaPlayer.create(this, R.raw.bubbles_3); 
    } 
    mp.start(); 

    bubblesAnimation.setVisible(true,true); 
    bubblesAnimation.start(); 
    break; 
    } 
} 
} 

そして、ここを超えてImageViewでフレームを1つ1つ再生する試みですが、最初と最後のフレームだけを再生します:

public void playAnimation(String name){ 
    final ImageView bubblesImageView = (ImageView) findViewById(R.id.bubbles_imageview); 
    bubblesImageView.setImageResource(R.drawable.bubbles_anim_v5_0003); 

    mHandler.postDelayed(new Runnable() { 
    public void run() { 
    bubblesImageView.setImageResource(R.drawable.bubbles_anim_v5_0015); 
    } 
    }, 500); 

    mHandler.postDelayed(new Runnable() { 
    public void run() { 
    bubblesImageView.setImageResource(R.drawable.bubbles_anim_v5_0025); 
    } 
    }, 500); 

    mHandler.postDelayed(new Runnable() { 
    public void run() { 
    bubblesImageView.setImageResource(R.drawable.bubbles_anim_v5_0035); 
    } 
    }, 500); 


} 

任意の助けをいただければ幸いです - 感謝

答えて

0

は、私の会社では、我々は同じ問題を抱えて、我々は(と、それは総災害だった)、このようにスプラッシュ画面を作成しようとしました。あなたが何らかのアニメーションを手に入れたい場合は、PNGフレームからビデオを生成してください(私はFFMPEGがそれを行うことができると思います)。そして、ビデオを再生します。

+0

ありがとうございます - 私は、アニメーションを使用しようとしています.Drawable ...あなたは私のコードを書くことについてアドバイスをしています一連のビットマップ? (私のテストはこれです)。このテクニックは遅すぎますか? – JoeD

1

mHandler.postDelayed(new Runnable(){...});は、すべて同時にトリガーします。 500 ms後に、

nHandler.postDelayed(new Runnable() { 
    public void run() { 
    bubblesImageView.setImageResource(R.drawable.bubbles_anim_v5_0015); 
    } 
    }, 500); 

    mHandler.postDelayed(new Runnable() { 
    public void run() { 
    bubblesImageView.setImageResource(R.drawable.bubbles_anim_v5_0025); 
    } 
    }, 1000); 

    mHandler.postDelayed(new Runnable() { 
    public void run() { 
    bubblesImageView.setImageResource(R.drawable.bubbles_anim_v5_0035); 
    } 
    }, 1500); 

のいずれかで順次トリガーする必要があります。また、500msの遅延後に次のキューを起動する必要があります。

mHandler.postDelayed(new Runnable() { 
public void run() { 
    bubblesImageView.setImageResource(R.drawable.bubbles_anim_v5_0015); 

    mHandler.postDelayed(new Runnable() { 
    public void run() { 
     bubblesImageView.setImageResource(R.drawable.bubbles_anim_v5_0025); 
     } 
    }, 1000); 
    } 
}, 500); 

それともR.drawable.xxx値でìntの配列を構築することができ、すべての500ミリ秒だけで次の画像を表示します。

関連する問題