Geetanjali
Geetanjali

Reputation: 1043

android how to handle thread with animation

How can i throw any object(Stone) continuously to a moving Horizontally object? I have used a thread which can throw stone using translate animation continuously but the memory usage is very much and my device get slows down after 3-4 min.How to resolve dis problem?

Upvotes: 0

Views: 1643

Answers (1)

Jave
Jave

Reputation: 31856

I think that you would be best of implementing your own SurfaceView. In it, you can draw animated objects (using a dedicated thread) much more feely than using view-animations. (You will of course have to rewrite parts of your code for this, but it might be for the best in the long run).
If you feel you want to try the SurfaceView, I recommend looking through the Lunar Lander example from android.

Example:

public class ThrowView extends SurfaceView implements SurfaceHolder.Callback, OnGestureListener{
    //The OnGestureListener can detect a fling motion.
    private class DrawingThread extends Thread{
        private final float timefactor = 0.0001f; //This is used to make the animation a bit slower. Play with this value if the animation seems too be to slow or too fast.
        private final float damp = 0.9; //This is used to slow down the object. If it stops too fast or slow, this is the value to change.
        private float stoneX = 0; //The x-coordinate of our stone object. Use this when drawing.
        private float stoneY = 0; //The y-coordinate of our stone object. Use this when drawing.
        @Override
        public void run(){
            while(running){
            Canvas c = null;
            try{
                c = surfaceHolder.lockCanvas(null);
                synchronized (surfaceHolder) { 
                    updatePhysics();
                    doDraw(c); //doDraw is not in this example, but it should essentially just draw our object at stoneX, stoneY.
                }
            }finally{
                if(c!=null) surfaceHolder.unlockCanvasAndPost(c); 
            }
            SystemClock.sleep(40);
        }
        private void updatePhysics(long time){
            //Calculate how much time has passed since last step:
            time1 = System.currentTimeMillis();
            dT = (time1 - time2)*timefactor;
            time2 = time1;

            //Move the stone in x depending on the time and velocity:
            stoneX += vX*dT;
            //Decrease the velocity:
            vX -= dT*damp:
        }
    }
    protected volatile float vX = 0; //This is the x-speed. To be able to throw in y too, just make another variable for that.
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        //This is our onFling, here we take the velocity of the users fling and set our variable to that.
        //Note that this value is based on pixels.
        vX = velocityX;
        return true;
    }
    @Override
    public boolean onDown(MotionEvent e) {
        //The onDown should return true so onFling can be activated:
        return true;
    }
}

This example is made according to the Lunar Lander sample for ease of use. Many methods (that were not necessary for this example) are omitted here, but can be implemented according to Lunar Lander.

Upvotes: 2

Related Questions