1

I have almost more than 1000 images which I need to display via Animation Drawable. I have started one animation in on windows focus change method.When I press next button the next Image animation should displayed(only one activity used). It shows the next animation 8 to 10 times but after that it crashes giving error 06-28 06:03:43.312: E/AndroidRuntime(12468): java.lang.OutOfMemoryError: bitmap size exceeds VM budget.

I have referred this Animation Drawable causing OutOfMemoryError on second run in Android but I don't know how to integrate this and I have also tried this Best Way to Animate images frame by frame in Android. I have also gone through this http://developer.android.com/training/displaying-bitmaps/index.html but still I am stuck... Please Help me...

        package com.example.quidest;

    import java.util.Random;

    import android.app.Activity;
    import android.graphics.Typeface;
    import android.graphics.drawable.AnimationDrawable;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.animation.Animation;
    import android.view.animation.Animation.AnimationListener;
    import android.view.animation.AnimationUtils;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;
    import android.widget.TextView;

    public class GamePlay extends Activity {

    String clue_apple= "Keeps the \nDoctor away…";  
    String clue_banana = "A Monkey's \n Favorite Food…";
    String clue_bottle = "Used to \n store Water…";
    String clue_beachball = "Make it bounce…";
    String clue_boy = "Not yet \n a Man…";

    Typeface comic;
    Typeface brush;


    //******Text View******************
    TextView t_imageno;
    TextView t_noOfAttempts;
    TextView t_itemname;
    TextView t_clue;

    //*******Edit Text*****************
    EditText e_attentEdit;
    EditText e_score;
    EditText e_entry;

    //*******String For Edit Text*******
    String sEdit_text_string;

    //*******Relative Layout Slider******
    RelativeLayout i_points;
    RelativeLayout i_cluesslider;

    //*******Image View Id's*************
    ImageView i_submit;
    ImageView i_pass;
    ImageView i_itemApple;
    ImageView i_banana10;
    ImageView i_beach_ball10;
    ImageView i_bottle10;
    ImageView i_boy;
    ImageView i_quidEst_Toast;
    ImageView i_error;


    //********Animation Variable**********
    Animation a_move_Rto_lP;
    Animation a_move_L_to_RP;
    Animation a_move_Rto_lC;
    Animation a_move_L_to_RC;
    Animation a_zoomin_out_QuidEst;
    Animation a_zoomin_error;
    //*********Counter Variable***********
    int c_imageno = 1;
    int c_attempt=0;
    int c_clue=0;
    int score = 0;
    int c_error=0;
    int c_apple=0;
    int c_banana=0;
    int c_bottle=0;
    int c_boy=0;
    int c_ball=0;

    AnimationDrawable appleanimation10;
    AnimationDrawable bananaanimation10;
    AnimationDrawable beachanimation10;
    AnimationDrawable bollte_last;
    AnimationDrawable boy_last;


    Random rand = new Random();
    Random rand_oncreate = new Random();
    RandomImage randomImage = new RandomImage();
    @Override
    protected void onCreate(Bundle savedInstanceState)

    {

        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gameplay);

        i_itemApple = (ImageView)findViewById(R.id.i_imageitem);
        i_banana10 = (ImageView)findViewById(R.id.i_imageitem1);
        i_beach_ball10 = (ImageView)findViewById(R.id.i_imageitem2);
        i_bottle10 = (ImageView)findViewById(R.id.i_imageitem3);
        t_itemname = (TextView)findViewById(R.id.t_itemname);
        i_quidEst_Toast = (ImageView)findViewById(R.id.i_quid_est_toast);
        i_error = (ImageView)findViewById(R.id.i_error);
        i_boy = (ImageView)findViewById(R.id.i_imageboy);

        int c_ranc_create = 5;

        switch (rand_oncreate.nextInt(c_ranc_create)) {

        case 0:
            i_itemApple.setBackgroundResource(R.drawable.apple_appear10);
            appleanimation10 = (AnimationDrawable) i_itemApple.getBackground();
            i_itemApple.setVisibility(View.VISIBLE);
            c_apple++;
            break;
        case 1:
            i_beach_ball10.setBackgroundResource(R.drawable.beachball_appear10);
            beachanimation10 = (AnimationDrawable) i_beach_ball10.getBackground();
            i_beach_ball10.setVisibility(View.VISIBLE);
            c_ball++;
                break;
        case 2:
            i_banana10.setBackgroundResource(R.drawable.banana_appear10);
            bananaanimation10 = (AnimationDrawable) i_banana10.getBackground();
            i_banana10.setVisibility(View.VISIBLE);
            c_banana++;
                break;
        case 3:
            i_bottle10.setBackgroundResource(R.drawable.bottle_last);
            bollte_last = (AnimationDrawable) i_bottle10.getBackground();
            i_bottle10.setVisibility(View.VISIBLE);
            c_bottle++;
                break;
        case 4:
            i_boy.setBackgroundResource(R.drawable.boy_last);
            boy_last = (AnimationDrawable) i_boy.getBackground();
            i_boy.setVisibility(View.VISIBLE);  
            c_boy++;
            break;

        default:
            break;
        }


    //  i_boy.setVisibility(View.VISIBLE);




    /*  i_itemApple.setBackgroundResource(R.drawable.apple_appear10);
        i_banana10.setBackgroundResource(R.drawable.banana_appear10);
        i_beach_ball10.setBackgroundResource(R.drawable.beachball_appear10);
        i_bottle10.setBackgroundResource(R.drawable.bottle_last);
        i_boy.setBackgroundResource(R.drawable.boy_last);*/





        /*appleanimation10 = (AnimationDrawable) i_itemApple.getBackground();
        bananaanimation10 = (AnimationDrawable) i_banana10.getBackground();
        beachanimation10 = (AnimationDrawable) i_beach_ball10.getBackground();
        bollte_last = (AnimationDrawable) i_bottle10.getBackground();
        boy_last = (AnimationDrawable) i_boy.getBackground();*/
        //**********************Font Files************************************************          
        comic = Typeface.createFromAsset(getAssets(), "fonts/COMIC.TTF");
        brush = Typeface.createFromAsset(getAssets(), "fonts/Brushy_Cre.ttf");


        //**********************Image View IDs*******************************************           
        t_imageno = (TextView)findViewById(R.id.t_imageno);
        e_attentEdit = (EditText)findViewById(R.id.e_attempt);
        e_score = (EditText)findViewById(R.id.e_score);
        i_points = (RelativeLayout)findViewById(R.id.Pointslider);
        i_cluesslider = (RelativeLayout)findViewById(R.id.Clueslider1);
        i_boy = (ImageView)findViewById(R.id.i_imageboy);
        i_submit = (ImageView)findViewById(R.id.i_submit);
        i_pass = (ImageView)findViewById(R.id.i_pass);
        e_entry = (EditText)findViewById(R.id.e_entry);
        t_noOfAttempts = (TextView)findViewById(R.id.t_noOfAttempt);
        t_clue = (TextView)findViewById(R.id.t_clue);
        t_imageno.setText(getString(R.string.Imageno) + c_imageno);


        //*********************Button On Click********************************************
        i_submit.setOnClickListener(onclick);
        i_pass.setOnClickListener(onclick);
        i_cluesslider.setOnClickListener(onclick);
        i_points.setOnClickListener(onclick);
        i_error.setOnClickListener(onclick);

        //*********************Animation from Right to left and left to right*************
        a_move_Rto_lP = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.move_r_tol);
        a_move_L_to_RP = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.move_l_tor);
        a_move_Rto_lC = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.move_r_tol);
        a_move_L_to_RC = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.move_l_tor);
        a_zoomin_out_QuidEst = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.zinoutquidest);
        a_zoomin_error = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.zinoutquidest);

        a_zoomin_out_QuidEst.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                // TODO Auto-generated method stub
                i_quidEst_Toast.setVisibility(View.GONE);
            }
        });
        //********************Setting Typeface*******************************************           
        e_score.setTypeface(brush);
        t_imageno.setTypeface(brush);
        e_attentEdit.setTypeface(comic);


    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        // TODO Auto-generated method stub
        super.onWindowFocusChanged(hasFocus);
//      int c_r_Images=4;
                ;
        if(hasFocus){
            if(c_apple ==1){
            //  i_itemApple.setVisibility(View.VISIBLE);

                appleanimation10.start();   
                i_banana10.setVisibility(View.GONE);
                i_beach_ball10.setVisibility(View.GONE);
                i_bottle10.setVisibility(View.GONE);
                i_boy.setVisibility(View.GONE);
            }
            else if(c_ball ==1){
                  beachanimation10.start();
                    i_itemApple.setVisibility(View.GONE);
                    i_banana10.setVisibility(View.GONE);
                    i_boy.setVisibility(View.GONE);
                    i_bottle10.setVisibility(View.GONE);
            }
            else if(c_banana ==1){
                bananaanimation10.start();
                i_itemApple.setVisibility(View.GONE);
                 i_beach_ball10.setVisibility(View.GONE);
                i_boy.setVisibility(View.GONE);
                 i_bottle10.setVisibility(View.GONE);
            }
            else if(c_boy ==1){
                boy_last.start();
            //  i_boy.setVisibility(View.VISIBLE);
                i_itemApple.setVisibility(View.GONE);
                i_banana10.setVisibility(View.GONE);
                i_beach_ball10.setVisibility(View.GONE);
                i_bottle10.setVisibility(View.GONE);

            }
            else if(c_bottle ==1){
                bollte_last.start();
            //  i_bottle10.setVisibility(View.VISIBLE);
                i_itemApple.setVisibility(View.GONE);
                i_banana10.setVisibility(View.GONE);
                i_beach_ball10.setVisibility(View.GONE);
                i_boy.setVisibility(View.GONE);
            }


        }

    }

    private OnClickListener onclick = new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()){

            case R.id.i_error:
                i_error.setVisibility(View.GONE);

                break;


            case R.id.i_submit:
                c_error++;
                sEdit_text_string = e_entry.getText().toString();
                if(sEdit_text_string.equals("")){
                i_error.setVisibility(View.VISIBLE);

                }

                else if(sEdit_text_string.equals("aaple")){
                    score = score+60;
                    e_score.setText(getString(R.string.score)+score);
                }

                break;
            case R.id.i_pass:
                c_imageno++;
                t_imageno.setText(getString(R.string.Imageno)+c_imageno);
                appearNextImage();
                break;

            case R.id.Pointslider:

                c_attempt++;
                if(c_attempt ==1){
                i_points.startAnimation(a_move_Rto_lP);
                t_noOfAttempts.setText(getString(R.string.NoOfAttempts));
                }
                else if (c_attempt ==2){
                    i_points.startAnimation(a_move_L_to_RP);
                    c_attempt =0;
                }
                break;


            case R.id.Clueslider1:
                c_clue++;
                if(c_clue ==1){
                    i_cluesslider.startAnimation(a_move_Rto_lC);
                    }
                    else if (c_clue ==2){
                        i_cluesslider.startAnimation(a_move_L_to_RC);
                        c_clue =0;
                    }
                break;
            }
        }

        private void appearNextImage() {
            // TODO Auto-generated method stub

            int c_r_NextImages=5;
            switch(rand.nextInt(c_r_NextImages)){
            case 0:
                t_clue.setText(clue_apple);
                i_itemApple.setBackgroundResource(R.drawable.apple_appear10);
                appleanimation10 = (AnimationDrawable) i_itemApple.getBackground();
                appleanimation10.start();   
                i_quidEst_Toast.setVisibility(View.VISIBLE);
                i_bottle10.setVisibility(View.GONE);
                i_quidEst_Toast.startAnimation(a_zoomin_out_QuidEst);
                i_itemApple.setVisibility(View.VISIBLE);
                i_banana10.setVisibility(View.GONE);
                i_beach_ball10.setVisibility(View.GONE);
                i_boy.setVisibility(View.GONE);

                break;
            case 1:
                t_clue.setText(clue_banana);
                i_banana10.setBackgroundResource(R.drawable.banana_appear10);
                bananaanimation10 = (AnimationDrawable) i_banana10.getBackground();
                bananaanimation10.start();
                i_quidEst_Toast.setVisibility(View.VISIBLE);
                i_quidEst_Toast.startAnimation(a_zoomin_out_QuidEst);
                i_banana10.setVisibility(View.VISIBLE);
                i_bottle10.setVisibility(View.GONE);
                i_itemApple.setVisibility(View.GONE);
                i_beach_ball10.setVisibility(View.GONE);
                i_boy.setVisibility(View.GONE);

                break;
            case 2:
                t_clue.setText(clue_bottle);

                i_bottle10.setBackgroundResource(R.drawable.bottle_last);
                bollte_last = (AnimationDrawable) i_bottle10.getBackground();
                bollte_last.start();
                i_quidEst_Toast.setVisibility(View.VISIBLE);
                i_quidEst_Toast.startAnimation(a_zoomin_out_QuidEst);
                i_bottle10.setVisibility(View.VISIBLE);
                i_itemApple.setVisibility(View.GONE);
                i_banana10.setVisibility(View.GONE);
                i_beach_ball10.setVisibility(View.GONE);
                i_boy.setVisibility(View.GONE);

                break;
            case 3:
                t_clue.setText(clue_beachball);

                i_beach_ball10.setBackgroundResource(R.drawable.beachball_appear10);
                beachanimation10 = (AnimationDrawable) i_beach_ball10.getBackground();
                beachanimation10.start();
                i_beach_ball10.setVisibility(View.VISIBLE);
                i_bottle10.setVisibility(View.GONE);
                i_boy.setVisibility(View.GONE);
                i_quidEst_Toast.setVisibility(View.VISIBLE);
                i_quidEst_Toast.startAnimation(a_zoomin_out_QuidEst);
                i_itemApple.setVisibility(View.GONE);
                i_banana10.setVisibility(View.GONE);    
                break;

            case 4:
                t_clue.setText(clue_boy);

                i_boy.setBackgroundResource(R.drawable.boy_last);
                boy_last = (AnimationDrawable) i_boy.getBackground();
                boy_last.start();
                i_beach_ball10.setVisibility(View.GONE);
                i_bottle10.setVisibility(View.GONE);
                i_boy.setVisibility(View.VISIBLE);
                i_quidEst_Toast.setVisibility(View.VISIBLE);
                i_quidEst_Toast.startAnimation(a_zoomin_out_QuidEst);
                i_itemApple.setVisibility(View.GONE);
                i_banana10.setVisibility(View.GONE);    
                break;

            default:

                break;
            }
        }
    };

}
Community
  • 1
  • 1
Abhi
  • 433
  • 2
  • 7
  • 17
  • Posting the problematic code would help. OOM errors are common when dealing with bitmaps, so it should be pretty easy to patch up. – ArmaAK Jun 28 '14 at 06:22
  • 1
    AnimationDrawable anim1; AnimationDrawable anim2; AnimationDrawable aim3;.....anim n; @Override public void onWindowFocusChanged(boolean hasFocus) { if(hasfocus){ //randomly anim1.start(); anim2.start(); anim2.start(); } } next_button.setOnClickListener{ //randomly anim1.start(); anim2.start(); anim3.start(); anim4.start(); . . animn.start(); } – Abhi Jun 28 '14 at 06:33
  • Edit your original post and put your code there instead, so it can format it correctly. – ArmaAK Jun 28 '14 at 06:45
  • hey ArmaAK in appearNextImage(); method animation are playing randomly almost 8 to 10 times and then crashes giving Out Of memory exception – Abhi Jun 28 '14 at 07:13
  • Well, to be honest I have no experience with AnimationDrawables, but I can tell you that for animations, all the frames are loaded into memory at once, which can be very taxing on memory. You can increase the heap size by adding largeHeap=true to your application tag in your manifest file, which may help. If that doesn't work, you could refer to this answer for a way to make your own animation which will reduce the impact on memory: http://stackoverflow.com/a/10993879/3150458 – ArmaAK Jun 28 '14 at 07:44

0 Answers0