Android: Rotate two objects(circles) onTouch with animation

367 views Asked by At

Basically just want to draw two circles (one red, one blue) and make them rotate with the rotate animation. Trying for days already but without any success.

Tried also to just move the animation method into the GameView class but it didn't work there either.

Currently it just crashes on onTouch. Here's my code so far:

GameScreen

    public class GameScreen  extends Activity  {

    private GameView myGameView;
    private DrawThread drawThread ;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game_screen);

        myGameView = (GameView) (findViewById(R.id.gameView1));

        myGameView.setZOrderOnTop(true);
        myGameView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
    }


    public boolean onTouchEvent(MotionEvent e) {
        int eventaction = e.getAction();
        switch (eventaction) {
            case MotionEvent.ACTION_DOWN:
                System.out.println("Clicked");
                myGameView.rotate(myGameView);
                myGameView.invalidate();
                break;

        }
        return true;
    }
}

GameView

    public class GameView extends SurfaceView implements
        SurfaceHolder.Callback {


    private BleenCatcher blueCatcher;
    private BleenCatcher redCatcher;
    private DrawThread drawThread;
    private int colorBlue = -16776961;
    private int colorRed = -65536;



    public GameView(Context context) {
        super(context);
        initialize();
    }

    public GameView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize();
    }

    public GameView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initialize();
    }

    private void initialize() {
        getHolder().addCallback(this);
        drawThread = new DrawThread(getHolder(), this);
        setFocusable(true);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        blueCatcher = new BleenCatcher(540, 850, colorBlue);
        redCatcher = new BleenCatcher(540, 950, colorRed);
        drawThread.setRunning(true);
        drawThread.start();
    }

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int  
       arg3) {
        // TODO Auto-generated method stub
    }

    public void surfaceDestroyed(SurfaceHolder arg0) {
        boolean retry = true;
        drawThread.setRunning(false);
        while (retry) {
            try {
                drawThread.join();
                retry = false;
            } catch (InterruptedException e) {   }
        }
    }

    public void onDraw(Canvas canvas) {

        redCatcher.onDraw(canvas);
        blueCatcher.onDraw(canvas);
    }

    public void rotate(GameView game ){
        redCatcher.changePosition(game);
        blueCatcher.changePosition(game);

    }

}

BleenCatcher

    public class BleenCatcher {

    int x, y, rad = 50;
    private Animation anima;
    private boolean rotate = false;
    private GameView myGameView;
    BleenPaint catcherPaint;


    public BleenCatcher(int x, int y, int color) {
        this.x = x;
        this.y = y;
        catcherPaint = new BleenPaint(1, Paint.Cap.SQUARE, Paint.Style.FILL,
            color);
    }


    public void onDraw(Canvas canvas) {
        if(rotate){
            canvas.drawCircle(x, y, rad, catcherPaint);
            createAnimation(canvas);
            rotate = false;
        }else{
            canvas.drawCircle(x, y, rad, catcherPaint);
        }
     }


    public void changePosition(GameView game){
        rotate = true;
        myGameView = game;
    }


    protected void createAnimation(Canvas canvas) {
        anima = new RotateAnimation(0, 180, 540 , 850);
        anima.setRepeatMode(Animation.RESTART);
        anima.setRepeatCount(Animation.INFINITE);
        anima.setDuration(1000L);
        myGameView.startAnimation(anima);
    }
}

DrawThread

    public class DrawThread extends Thread {
    private SurfaceHolder surfaceHolder;
    private GameView surfaceView;
    private boolean run = false;

    public DrawThread(SurfaceHolder surfaceHolder, GameView surfaceView) {
        this.surfaceHolder = surfaceHolder;
        this.surfaceView = surfaceView;
        run = false;
    }

    public void setRunning(boolean run) {
        Log.d("setRunning@DrawThread", "Run status is " + run);
        this.run = run;
    }

    @Override
    public void run() {
        Canvas canvas = null;
        while (run) {
            try {
                canvas = surfaceHolder.lockCanvas(null);
                synchronized (surfaceHolder) {
                    surfaceView.onDraw(canvas);
                }
            } finally {
                if (canvas != null) {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}

BleenPaint

    public class BleenPaint extends Paint {
    public BleenPaint(int strokeWidth, Paint.Cap cap, Paint.Style style,
                  int color) {
        setStrokeWidth(strokeWidth);
        setAntiAlias(true);
        setStrokeCap(cap);
        setStyle(style);
        setColor(color);
    }
}

Any help is appreciated.

1

There are 1 answers

3
Chaudhary Amar On

Make a anim folder in res and make a flipping.xml like this and use that in your class.

<set android:interpolator="@android:anim/linear_interpolator">
<rotate android:fromDegrees="0" 
android:toDegrees="360" 
android:pivotX="50%"
android:pivotY="50%" 
android:duration="500" 
android:startOffset="0"
android:repeatCount="1"
android:repeatMode="reverse"/></set>

Like this in your code & manage time for how much time you want the animation.

AnimatorSet set;
set = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.anim.flipping);
    set.setTarget(img_logo);
    set.start();

    Timer timer = new Timer();
    timer.schedule(task, 2000);