Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 3940246
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 20, 20262026-05-20T00:23:44+00:00 2026-05-20T00:23:44+00:00

I want to use certain animations such as bounce inside my canvas. Is it

  • 0

I want to use certain animations such as bounce inside my canvas. Is it possible to use the animation interpolators inside?

In my case I want to rotate an image from 0 to 180 degrees with a bounce at the end.

How is it possible?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-20T00:23:44+00:00Added an answer on May 20, 2026 at 12:23 am

    The Android animation class applies to objects such as views and layouts. The canvas is just a surface for drawing which is either part of a View or linked to a bitmap. In onDraw in a custom view only one frame is drawn at the time until next invalidate is called, which means that you have to draw your animation frame by frame. Here is an example of bouncing ball which rotates, which you may find useful.

    rotating bouncing ball

    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.os.Bundle;
    import android.text.format.Time;
    import android.view.View;
    
    public class StartActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new BallBounce(this));
        }
    }
    
    
    class BallBounce extends View {
        int screenW;
        int screenH;
        int X;
        int Y;
        int initialY ;
        int ballW;
        int ballH;
        int angle;
        float dY;
        float acc;
        Bitmap ball, bgr;
    
        public BallBounce(Context context) {
            super(context);
            ball = BitmapFactory.decodeResource(getResources(),R.drawable.football); //load a ball image
            bgr = BitmapFactory.decodeResource(getResources(),R.drawable.sky_bgr); //load a background
            ballW = ball.getWidth();
            ballH = ball.getHeight();
            acc = 0.2f; //acceleration
            dY = 0; //vertical speed
            initialY = 100; //Initial vertical position.
            angle = 0; //Start value for rotation angle.
        }
    
        @Override
        public void onSizeChanged (int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            screenW = w;
            screenH = h;
            bgr = Bitmap.createScaledBitmap(bgr, w, h, true); //Resize background to fit the screen.
            X = (int) (screenW /2) - (ballW / 2) ; //Centre ball into the centre of the screen.
            Y = initialY;
        }
    
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            //Draw background.
            canvas.drawBitmap(bgr, 0, 0, null);
    
            //Compute roughly ball speed and location.
            Y+= (int) dY; //Increase or decrease vertical position.
            if (Y > (screenH - ballH)) {
                dY=(-1)*dY; //Reverse speed when bottom hit.
            }
            dY+= acc; //Increase or decrease speed.
    
            //Increase rotating angle.
            if (angle++ >360)
                angle =0;
    
            //Draw ball
            canvas.save(); //Save the position of the canvas.
            canvas.rotate(angle, X + (ballW / 2), Y + (ballH / 2)); //Rotate the canvas.
            canvas.drawBitmap(ball, X, Y, null); //Draw the ball on the rotated canvas.
            canvas.restore(); //Rotate the canvas back so that it looks like ball has rotated.
    
            //Call the next frame.
            invalidate();
        }
    }
    

    This is just a simple illustration but I would use surfaceView and drive frames from another thread, which is a bit more complicated but a proper way to do when making interactive animations like games etc. Here is an example with a scrolling backround and the user can move the ball with his finger:

    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    
    public class SurfaceViewActivity extends Activity {
        BallBounces ball;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ball = new BallBounces(this);
            setContentView(ball);
        }
    }
    
    
    class BallBounces extends SurfaceView implements SurfaceHolder.Callback {
        GameThread thread;
        int screenW; //Device's screen width.
        int screenH; //Devices's screen height.
        int ballX; //Ball x position.
        int ballY; //Ball y position.
        int initialY ;
        float dY; //Ball vertical speed.
        int ballW;
        int ballH;
        int bgrW;
        int bgrH;
        int angle;
        int bgrScroll;
        int dBgrY; //Background scroll speed.
        float acc;
        Bitmap ball, bgr, bgrReverse;
        boolean reverseBackroundFirst;
        boolean ballFingerMove;
    
        //Measure frames per second.
        long now;
        int framesCount=0;
        int framesCountAvg=0;
        long framesTimer=0;
        Paint fpsPaint=new Paint();
    
        //Frame speed
        long timeNow;
        long timePrev = 0;
        long timePrevFrame = 0;
        long timeDelta;
    
    
        public BallBounces(Context context) {
            super(context);
            ball = BitmapFactory.decodeResource(getResources(),R.drawable.football); //Load a ball image.
            bgr = BitmapFactory.decodeResource(getResources(),R.drawable.sky_bgr); //Load a background.
            ballW = ball.getWidth();
            ballH = ball.getHeight();
    
            //Create a flag for the onDraw method to alternate background with its mirror image.
            reverseBackroundFirst = false;
    
            //Initialise animation variables.
            acc = 0.2f; //Acceleration
            dY = 0; //vertical speed
            initialY = 100; //Initial vertical position
            angle = 0; //Start value for the rotation angle
            bgrScroll = 0;  //Background scroll position
            dBgrY = 1; //Scrolling background speed
    
            fpsPaint.setTextSize(30);
    
            //Set thread
            getHolder().addCallback(this);
    
            setFocusable(true);
        }
    
        @Override
        public void onSizeChanged (int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            //This event-method provides the real dimensions of this custom view.
            screenW = w;
            screenH = h;
    
            bgr = Bitmap.createScaledBitmap(bgr, w, h, true); //Scale background to fit the screen.
            bgrW = bgr.getWidth();
            bgrH = bgr.getHeight();
    
            //Create a mirror image of the background (horizontal flip) - for a more circular background.
            Matrix matrix = new Matrix();  //Like a frame or mould for an image.
            matrix.setScale(-1, 1); //Horizontal mirror effect.
            bgrReverse = Bitmap.createBitmap(bgr, 0, 0, bgrW, bgrH, matrix, true); //Create a new mirrored bitmap by applying the matrix.
    
            ballX = (int) (screenW /2) - (ballW / 2) ; //Centre ball X into the centre of the screen.
            ballY = -50; //Centre ball height above the screen.
        }
    
        //***************************************
        //*************  TOUCH  *****************
        //***************************************
        @Override
        public synchronized boolean onTouchEvent(MotionEvent ev) {
    
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    ballX = (int) ev.getX() - ballW/2;
                    ballY = (int) ev.getY() - ballH/2;
    
                    ballFingerMove = true;
                    break;
                }
    
                case MotionEvent.ACTION_MOVE: {
                    ballX = (int) ev.getX() - ballW/2;
                    ballY = (int) ev.getY() - ballH/2;
    
                    break;
                }
    
                case MotionEvent.ACTION_UP:
                    ballFingerMove = false;
                    dY = 0;
                    break;
                }
            return true;
        }
    
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            //Draw scrolling background.
            Rect fromRect1 = new Rect(0, 0, bgrW - bgrScroll, bgrH);
            Rect toRect1 = new Rect(bgrScroll, 0, bgrW, bgrH);
    
            Rect fromRect2 = new Rect(bgrW - bgrScroll, 0, bgrW, bgrH);
            Rect toRect2 = new Rect(0, 0, bgrScroll, bgrH);
    
            if (!reverseBackroundFirst) {
                canvas.drawBitmap(bgr, fromRect1, toRect1, null);
                canvas.drawBitmap(bgrReverse, fromRect2, toRect2, null);
            }
            else{
                canvas.drawBitmap(bgr, fromRect2, toRect2, null);
                canvas.drawBitmap(bgrReverse, fromRect1, toRect1, null);
            }
    
            //Next value for the background's position.
            if ( (bgrScroll += dBgrY) >= bgrW) {
                bgrScroll = 0;
                reverseBackroundFirst = !reverseBackroundFirst;
            }
    
            //Compute roughly the ball's speed and location.
            if (!ballFingerMove) {
                ballY += (int) dY; //Increase or decrease vertical position.
                if (ballY > (screenH - ballH)) {
                    dY=(-1)*dY; //Reverse speed when bottom hit.
                }
                dY+= acc; //Increase or decrease speed.
            }
    
            //Increase rotating angle
            if (angle++ >360)
                angle =0;
    
            //DRAW BALL
            //Rotate method one
            /*
            Matrix matrix = new Matrix();
            matrix.postRotate(angle, (ballW / 2), (ballH / 2)); //Rotate it.
            matrix.postTranslate(ballX, ballY); //Move it into x, y position.
            canvas.drawBitmap(ball, matrix, null); //Draw the ball with applied matrix.
    
            */// Rotate method two
    
            canvas.save(); //Save the position of the canvas matrix.
            canvas.rotate(angle, ballX + (ballW / 2), ballY + (ballH / 2)); //Rotate the canvas matrix.
            canvas.drawBitmap(ball, ballX, ballY, null); //Draw the ball by applying the canvas rotated matrix.
            canvas.restore(); //Rotate the canvas matrix back to its saved position - only the ball bitmap was rotated not all canvas.
    
            //*/
    
            //Measure frame rate (unit: frames per second).
             now=System.currentTimeMillis();
             canvas.drawText(framesCountAvg+" fps", 40, 70, fpsPaint);
             framesCount++;
             if(now-framesTimer>1000) {
                     framesTimer=now;
                     framesCountAvg=framesCount;
                     framesCount=0;
             }
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            thread = new GameThread(getHolder(), this);
            thread.setRunning(true);
            thread.start();
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            boolean retry = true;
            thread.setRunning(false);
            while (retry) {
                try {
                    thread.join();
                    retry = false;
                } catch (InterruptedException e) {
    
                }
            }
        }
    
    
        class GameThread extends Thread {
            private SurfaceHolder surfaceHolder;
            private BallBounces gameView;
            private boolean run = false;
    
            public GameThread(SurfaceHolder surfaceHolder, BallBounces gameView) {
                this.surfaceHolder = surfaceHolder;
                this.gameView = gameView;
            }
    
            public void setRunning(boolean run) {
                this.run = run;
            }
    
            public SurfaceHolder getSurfaceHolder() {
                return surfaceHolder;
            }
    
            @Override
            public void run() {
                Canvas c;
                while (run) {
                    c = null;
    
                    //limit frame rate to max 60fps
                    timeNow = System.currentTimeMillis();
                    timeDelta = timeNow - timePrevFrame;
                    if ( timeDelta < 16) {
                        try {
                            Thread.sleep(16 - timeDelta);
                        }
                        catch(InterruptedException e) {
    
                        }
                    }
                    timePrevFrame = System.currentTimeMillis();
    
                    try {
                        c = surfaceHolder.lockCanvas(null);
                        synchronized (surfaceHolder) {
                           //call methods to draw and process next fame
                            gameView.onDraw(c);
                        }
                    } finally {
                        if (c != null) {
                            surfaceHolder.unlockCanvasAndPost(c);
                        }
                    }
                }
            }
        }
    }
    

    Here are the images:

    sky backround

    enter image description here

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I want to use functionality from a certain method in apache commons StringUtils. I
I have a certain text in Java, and I want to use pattern and
Hi I want to work around a 'bug' in certain RSS-feeds , which use
i want use some data from a website with web service. i have a
We are creating an ios app, In which we want to use certain interactive
Depending of some flag I want to use certain component in my mxml. There
For browsers < IE7, I want to use a certain style attribute, while for
Instead of using a certain jar in my WEB-INF/lib folder, I want to use
I want to use some of the new features of mshtml.dll version 9.0 such
There are times when I want to use mootools for certain things and Prototype

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.