Search code examples
androidanimationdelay

Animation, delay


I would like to make an animation, I have 10 images of a ball and I want to do:

  1. Image1 visible, all the other images hidden
  2. Image2 visible all the other images hidden
  3. ...
  4. Image10 visible all the other images hidden

Should I do that in one animation (how?) or should I create a java method showImage(String pathimage) which would show the image located at pathimage and hide the others? Could I put any idea of time delay with using

handler.postDelayed(new Runnable() { 
    public void run() { }
}

EDIT, here is my code The problem is that run() is always called in what seems to be an infinite loop. But I don't see where is my error

GAMEACTIVITY

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
.....
        ImageView image2 = (ImageView) findViewById(R.id.imageView3);
        image2.setOnTouchListener(new OnTouchListener(){

            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                myAsyncRunnable mar = new myAsyncRunnable(GameActivity.this);
                mar.execute(null);
                PhotoTask photoTask = new PhotoTask(camera,surfaceCamera,isPreview,holder,GameActivity.this);
                photoTask.execute(null);
                Log.w("GAMEACTIVITY","PHOTOTASK");
                return false;
            }

        });
}

My Async Task

public class myAsyncRunnable extends AsyncTask<Void, Boolean, Void> {

    GameActivity gameactivity;

    @Override
    protected Void doInBackground(Void... params) {
        pull();
        return null;
    }

public myAsyncRunnable(GameActivity gameactivity) {
    super();
    this.gameactivity = gameactivity;
}


    public void pull() {

        final ImageView image3 = (ImageView) gameactivity.findViewById(R.id.imageView3);
        final int drawables[] = new int[] {R.drawable.pull2,R.drawable.pull3,R.drawable.pull4,R.drawable.pull5,R.drawable.pull6,R.drawable.pull7};
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                for (int i=0;i<drawables.length;i++) {
                    image3.setImageResource(drawables[i]);
                    gameactivity.handler.postDelayed(this, 500);
                    Log.w("asyncrunnable","run"+i);
                }

            }

        };
        gameactivity.handler.post(runnable);
    }
}

Solution

  • You should not create 10 ImageViews to do such animation.

    Only one ImageView should suffice! Use a handler to update the Image using any flavor of setImage every x milliseconds or so.

    Initialize the images in an array and the current image in an integer :

    int drawables[] = new int[] {R.drawable.image1, R.drawable.image2, ...};
    int mCurrent = 0;
    

    Then initialize your updater:

     Runnable runnable = new Runnable() {
    
        @Override
        public void run() {
                     if(mCurrent>=drawables.length)mCurrent=0;
                     imageView.setImageResource(drawables[mCurrent]);
                     mHandler.postDelayed(this, 3000); //every 3 seconds
        }
    };
    

    Finally when you want to start, just post the runnable:

    mHandler.post(runnable);
    

    Your code is wrong:

    Try this pull function (although i do not really approve the whole code style but no time to fix that)

    public void pull() {
    
        final ImageView image3 = (ImageView) gameactivity.findViewById(R.id.imageView3);
        final int drawables[] = new int[] {R.drawable.pull2,R.drawable.pull3,R.drawable.pull4,R.drawable.pull5,R.drawable.pull6,R.drawable.pull7};
                for (int i=0;i<drawables.length;i++) {
                    final int j = i;
        Runnable runnable = new Runnable() {
    
            @Override
            public void run() {
                    image3.setImageResource(drawables[j]);
    
            }
    
        };
                    gameactivity.handler.postDelayed(this, 500 * i);
                    Log.w("asyncrunnable","run"+i);
                }
    }
    

    }