私は、ボタンを押すとさまざまなフレームごとのアニメーションを再生するボタンを持つアプリケーションを持っています。アニメーションは.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);
}
任意の助けをいただければ幸いです - 感謝
ありがとうございます - 私は、アニメーションを使用しようとしています.Drawable ...あなたは私のコードを書くことについてアドバイスをしています一連のビットマップ? (私のテストはこれです)。このテクニックは遅すぎますか? – JoeD