Поверните один круг вокруг другого в android - PullRequest
0 голосов
/ 09 апреля 2020

Мне нужно сделать анимацию холста в Android студии (используя Java), где мне нужно представить один круг в центре экрана, и мне нужно иметь несколько кругов, которые вращаются вокруг этого основного центра круг (аналогично тому, как планеты вращаются вокруг Солнца). Итак, моя проблема в том, как сделать анимацию, которая будет делать это - сделать один круг go вокруг другого круга с фиксированным центром? С помощью приведенного ниже кода я пытаюсь определить логи c для одного круга, и я бы использовал ту же / аналогичную логику c для анимации других кругов. Пожалуйста, поделитесь информацией, если вы знаете, как я могу решить эту проблему. Спасибо.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    screenDimensions = getDisplayDimensions();
    mainCircleX = screenDimensions[0] / 2;
    mainCircleY = screenDimensions[1] / 2;
    mainRadius = screenDimensions[0] - (screenDimensions[0] * 0.9f);

    circle1X = mainCircleX + mainRadius + (screenDimensions[0] - screenDimensions[0] * 0.95f);
    circle1Y = mainCircleY;

bitmap = Bitmap.createBitmap(screenDimensions[0], screenDimensions[1], Bitmap.Config.ARGB_8888);
        canvas = new Canvas(bitmap);

        paint = new Paint();

        imageView = findViewById(R.id.imageView);
        imageView.setImageBitmap(bitmap);


        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        renderFrame();
                    }
                });

            }
        }, 200, 400);


    }

private void renderFrame() {

        paint.setColor(Color.YELLOW);
        canvas.drawColor(Color.parseColor("#8D99A0"));
        canvas.drawCircle(mainCircleX, mainCircleY, mainRadius, paint);

        paint.reset();

        paint.setColor(Color.parseColor("#CC4125"));
        paint.setStrokeWidth(10f);
        paint.setStyle(Paint.Style.STROKE);

        canvas.drawCircle(circle1X, circle1Y, 40, paint);
/*Need logic here that will make the circle with circle1X and circle1Y center coordinates, go around the main circle*/

imageView.invalidate();
}

Я пытался повернуть холст (canvas.rotate ()), но это решает проблему только одним кружком. Кроме того, другие круги должны go в разных направлениях и на разных скоростях, поэтому вращение холста, вероятно, не сработает. Я довольно новичок в этом, поэтому любая помощь будет оценена. Спасибо.

1 Ответ

0 голосов
/ 11 апреля 2020

Я нашел приемлемое решение. Можно использовать canvas.rotate (), но иметь отдельный объект Canvas и Paint для каждого круга, который мне нужно вращать вокруг основного круга. Итак, вот код, который работал для меня:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        screenDimensions = getDisplayDimensions();
        mainCircleX = screenDimensions[0] / 2;
        mainCircleY = screenDimensions[1] / 2;
        mainRadius = screenDimensions[0] - (screenDimensions[0] * 0.9f);


        circle1X = mainCircleX + mainRadius + (screenDimensions[0] - screenDimensions[0] * 0.95f);
        circle1Y = mainCircleY;
        circle2X = (mainCircleX + mainRadius + 100f);
        circle2Y = screenDimensions[1] - 1060f;
        circle3X = screenDimensions[0] - (screenDimensions[0] * 0.85f);
        circle3Y = mainCircleY;
        circle4X = screenDimensions[0] - (screenDimensions[0] * 0.85f);
        circle4Y = screenDimensions[1] - 570;

        bitmap = Bitmap.createBitmap(screenDimensions[0], screenDimensions[1], Bitmap.Config.ARGB_8888);
        canvasCentral = new Canvas(bitmap);
        canvas1 = new Canvas(bitmap);
        canvas2 = new Canvas(bitmap);
        canvas3 = new Canvas(bitmap);
        canvas4 = new Canvas(bitmap);

        paintCentral = new Paint();
        paint1 = new Paint();
        paint2 = new Paint();
        paint3 = new Paint();
        paint4 = new Paint();

        imageView = findViewById(R.id.imageView);
        imageView.setImageBitmap(bitmap);


        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        renderFrame1();

                    }
                });

            }
        }, 200, 400);


    }


    private void renderFrame1() {


        canvasCentral.drawColor(Color.parseColor("#8D99A0"));
        paintCentral.setColor(Color.YELLOW);
        canvasCentral.drawCircle(mainCircleX, mainCircleY, mainRadius, paintCentral);


        paint1.setColor(Color.parseColor("#CC4125"));
        paint1.setStrokeWidth(10f);
        paint1.setStyle(Paint.Style.STROKE);

        paint2.setColor(Color.parseColor("#CC4125"));
        paint2.setStrokeWidth(10f);
        paint2.setStyle(Paint.Style.STROKE);

        paint3.setColor(Color.parseColor("#CC4125"));
        paint3.setStrokeWidth(10f);
        paint3.setStyle(Paint.Style.STROKE);

        paint4.setColor(Color.parseColor("#CC4125"));
        paint4.setStrokeWidth(10f);
        paint4.setStyle(Paint.Style.STROKE);

        /*******FIRST CIRCLE*******/
        canvas1.drawCircle(circle1X, circle1Y, 40, paint1);
        canvas1.rotate(angle, screenDimensions[0] / 2, screenDimensions[1] / 2);

        /*******SECOND CIRCLE*******/
        canvas2.drawCircle(circle2X, circle2Y, 40, paint2);
        canvas2.rotate(-50, screenDimensions[0] / 2, screenDimensions[1] / 2);

        /*******THIRD CIRCLE*******/
        canvas3.drawCircle(circle3X, circle3Y, 40, paint3);
        canvas3.rotate(30, screenDimensions[0] / 2, screenDimensions[1] / 2);

        /*******FOURTH CIRCLE*******/
        canvas4.drawCircle(circle4X, circle4Y, 40, paint4);
        canvas4.rotate(-80, screenDimensions[0] / 2, screenDimensions[1] / 2);

        imageView.invalidate();
}
...