2

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.

user3361146
  • 103
  • 3
  • 9

1 Answers1

0

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);
Chaudhary Amar
  • 836
  • 8
  • 20
  • Do I put that in GameView? And how does the compiler know that I mean those two circles with that code. Can't see any association. – user3361146 Jun 25 '15 at 14:41
  • Use this in your GameView Class in ontouch method of the circles/images. – Chaudhary Amar Jun 26 '15 at 04:48
  • Copied it in the rotate method in the GameView class and got three errors: 1) Cannot resolve task; 2) For this in loadAnimator: Wrong 1st Argument found GameView but context required. 3) R.anim.flipping: Excepted resource of type animator. – user3361146 Jun 27 '15 at 10:19