2013-07-10 3 views
0

Я разрабатываю Android-игру. он почти закончен и попробовал его в 10.1 таблетках, nexus 7, nexus 4, HTC senstation, он работал над всеми из них. Однако, когда я попробовал это на Galaxy s3, я получил ошибку OutofMemory, когда Im вызывал фотографии в анимации фрейма xml. теперь я решил эту проблему, изменив размер pics в папке xhdpi, но результаты не были удовлетворительными. Есть ли какой-либо достаточный метод, который я могу использовать для масштабирования изображений, отображаемых в анимации анимации кадра.Ошибка OutOfMemory android

Вот код:

public class Logo extends Activity { 

    private ImageView iv; 
    Thread timer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_logo); 

     iv = (ImageView) findViewById(R.id.imageView1); 
     iv.setBackgroundResource(R.anim.anime); 

     // thread for animating the logo and moving to next activity after 
     // display. 
     timer = new Thread() { 

      @Override 
      public void run() { 
       try { 
        sleep(7000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } finally { 
        //Intent i = new Intent(); 
        //i.setClass(Logo.this, StartPoint.class); 
        //startActivity(i); 
       } 
      } 
     }; 
    } 

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     // TODO Auto-generated method stub 
     super.onWindowFocusChanged(hasFocus); 
     AnimationDrawable anime = (AnimationDrawable) iv.getBackground(); 
     if (hasFocus) { 
      anime.start(); 
      timer.start(); 
     } else { 
      anime.stop(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.logo, menu); 
     return true; 
    } 

    @Override 
    protected void onStop() { 
     // TODO Auto-generated method stub 
     super.onStop(); 
     finish(); // to remove this activity. 
    } 
} 

здесь является anime.xml:

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android 
android:oneshot="true"> 
<item android:drawable="@drawable/a1" android:duration="60" /> 
<item android:drawable="@drawable/a2" android:duration="60" /> 
<item android:drawable="@drawable/a3" android:duration="60" /> 
<item android:drawable="@drawable/a4" android:duration="60" /> 
<item android:drawable="@drawable/a5" android:duration="60" /> 
<item android:drawable="@drawable/a6" android:duration="60" /> 
<item android:drawable="@drawable/a7" android:duration="60" /> 
<item android:drawable="@drawable/a8" android:duration="60" /> 
<item android:drawable="@drawable/a9" android:duration="60" /> 
<item android:drawable="@drawable/a10" android:duration="60" /> 
<item android:drawable="@drawable/a11" android:duration="60" /> 
<item android:drawable="@drawable/a12" android:duration="60" /> 
<item android:drawable="@drawable/a13" android:duration="60" /> 
<item android:drawable="@drawable/a14" android:duration="60" /> 
<item android:drawable="@drawable/a15" android:duration="60" /> 
<item android:drawable="@drawable/a16" android:duration="60" /> 
<item android:drawable="@drawable/a17" android:duration="60" /> 
<item android:drawable="@drawable/a18" android:duration="60" /> 
<item android:drawable="@drawable/a19" android:duration="60" /> 
<item android:drawable="@drawable/a20" android:duration="60" /> 
<item android:drawable="@drawable/a21" android:duration="60" /> 
<item android:drawable="@drawable/a22" android:duration="60" /> 
<item android:drawable="@drawable/a23" android:duration="60" /> 
<item android:drawable="@drawable/a24" android:duration="60" /> 
<item android:drawable="@drawable/a25" android:duration="60" /> 
<item android:drawable="@drawable/a26" android:duration="60" /> 
<item android:drawable="@drawable/a27" android:duration="60" /> 

</animation-list> 

Теперь я видел много ответов, что иллюстрирует bitmapFactory.options , но как я могу применить эти параметры в XML файл, и если это невозможно. есть ли другие методы, которые я могу использовать, вместо того, чтобы изменять размер фото. Спасибо заранее.

здесь я попытался применить код programmaticaly и до сих пор получил ту же ошибку:

//onCreate and thread then 
public void onWindowFocusChanged(boolean hasFocus) { 
    // TODO Auto-generated method stub 
    super.onWindowFocusChanged(hasFocus); 

    BitmapDrawable frame1 = (BitmapDrawable)getResources().getDrawable(R.drawable.a1); 
    BitmapDrawable frame2 = (BitmapDrawable)getResources().getDrawable(R.drawable.a2); 
    BitmapDrawable frame3 = (BitmapDrawable)getResources().getDrawable(R.drawable.a3); 
    BitmapDrawable frame4 = (BitmapDrawable)getResources().getDrawable(R.drawable.a4); 
    BitmapDrawable frame5 = (BitmapDrawable)getResources().getDrawable(R.drawable.a5); 
    BitmapDrawable frame6 = (BitmapDrawable)getResources().getDrawable(R.drawable.a6); 
    BitmapDrawable frame7 = (BitmapDrawable)getResources().getDrawable(R.drawable.a7); 
    BitmapDrawable frame8 = (BitmapDrawable)getResources().getDrawable(R.drawable.a8); 
    BitmapDrawable frame9 = (BitmapDrawable)getResources().getDrawable(R.drawable.a9); 
    BitmapDrawable frame10 = (BitmapDrawable)getResources().getDrawable(R.drawable.a10); 
    BitmapDrawable frame11 = (BitmapDrawable)getResources().getDrawable(R.drawable.a11); 
    BitmapDrawable frame12 = (BitmapDrawable)getResources().getDrawable(R.drawable.a12); 
    BitmapDrawable frame13 = (BitmapDrawable)getResources().getDrawable(R.drawable.a13); 
    BitmapDrawable frame14 = (BitmapDrawable)getResources().getDrawable(R.drawable.a14); 
    BitmapDrawable frame15 = (BitmapDrawable)getResources().getDrawable(R.drawable.a15); 
    BitmapDrawable frame16 = (BitmapDrawable)getResources().getDrawable(R.drawable.a16); 
    BitmapDrawable frame17 = (BitmapDrawable)getResources().getDrawable(R.drawable.a17); 
    BitmapDrawable frame18 = (BitmapDrawable)getResources().getDrawable(R.drawable.a18); 
    BitmapDrawable frame19 = (BitmapDrawable)getResources().getDrawable(R.drawable.a19); 
    BitmapDrawable frame20 = (BitmapDrawable)getResources().getDrawable(R.drawable.a20); 
    BitmapDrawable frame21 = (BitmapDrawable)getResources().getDrawable(R.drawable.a21); 
    BitmapDrawable frame22 = (BitmapDrawable)getResources().getDrawable(R.drawable.a22); 
    BitmapDrawable frame23 = (BitmapDrawable)getResources().getDrawable(R.drawable.a23); 
    BitmapDrawable frame24 = (BitmapDrawable)getResources().getDrawable(R.drawable.a24); 
    BitmapDrawable frame25 = (BitmapDrawable)getResources().getDrawable(R.drawable.a25); 
    BitmapDrawable frame26 = (BitmapDrawable)getResources().getDrawable(R.drawable.a26); 
    BitmapDrawable frame27 = (BitmapDrawable)getResources().getDrawable(R.drawable.a27); 

    final AnimationDrawable anime = new AnimationDrawable(); 
    anime.setOneShot(true); 
    anime.addFrame(frame1, 60); 
    anime.addFrame(frame2, 60); 
    anime.addFrame(frame3, 60); 
    anime.addFrame(frame4, 60); 
    anime.addFrame(frame5, 60); 
    anime.addFrame(frame6, 60); 
    anime.addFrame(frame7, 60); 
    anime.addFrame(frame8, 60); 
    anime.addFrame(frame9, 60); 
    anime.addFrame(frame10, 60); 
    anime.addFrame(frame11, 60); 
    anime.addFrame(frame12, 60); 
    anime.addFrame(frame13, 60); 
    anime.addFrame(frame14, 60); 
    anime.addFrame(frame15, 60); 
    anime.addFrame(frame16, 60); 
    anime.addFrame(frame17, 60); 
    anime.addFrame(frame18, 60); 
    anime.addFrame(frame19, 60); 
    anime.addFrame(frame20, 60); 
    anime.addFrame(frame21, 60); 
    anime.addFrame(frame22, 60); 
    anime.addFrame(frame23, 60); 
    anime.addFrame(frame24, 60); 
    anime.addFrame(frame25, 60); 
    anime.addFrame(frame26, 60); 
    anime.addFrame(frame27, 60); 


    iv.setBackgroundDrawable(anime); 
    if (hasFocus) { 
     anime.start(); 
     timer.start(); 
    } 

    else 
     anime.stop(); 
} 
+0

Вы пытались создать анимацию программно? – sandrstar

+0

Нет, я не думал, что это возможно, я собираюсь прочитать об этом, так что вы говорите, что если бы я реализовал его программно, я мог бы добавить опции bitmapfactory на фотографии? – Coderji

+1

хорошо, что вы никогда не знаете, какое устройство может это поддерживать, и какое устройство не может ... проверить память кучи в представлениях DDMS для устройств, которые у вас есть ... так же, как предложено sandrstar. U может сделать анимацию программным способом .. это решает проблему часто – user632905

ответ

2

Галактика S3 на самом деле имеет относительно небольшой размер кучи по умолчанию (32 МБ) для его спецификации.

Вы можете использовать временный обход этой проблемы, запрашивая большую кучу и проверяя, устраняет ли это вашу проблему.

<application android:largeHeap="true"> 
     . . . 
</application> 

Тогда я работал бы по размеру и типу ресурсов кадра.

Cheers.

+0

Даже после добавления, у меня все еще есть ошибка, значит ли это, что я использую слишком много памяти ?! Думаю, я просто изменил размер фото. – Coderji

+0

Можете ли вы дать мне более подробную информацию о размере разрешения и формате ресурсов? И, может быть, какой тип анимации (весь экран, только часть его) вы пытаетесь выполнить. –

+0

У меня есть 27 фото, каждый рис имеет размер 1000 * 600 с разрешением 300 точек на дюйм как по горизонтали, так и по вертикали. размер каждого изображения составляет 55,7 КБ. Im, используя изображение для отображения заставки для игры, хотя тот же формат работал на Nexus 4 и других устройствах, о которых я упоминал ранее – Coderji

Смежные вопросы