Android - 画布圈必须在第二个周围进行圆周运动吗?

问题描述 投票:1回答:1

我画了一个大圆圈和一个小圆圈。小圆圈必须围绕大圆旋转,如太阳和地球。我无法解决问题。小圆圈没有圆周运动。我该如何解决这个问题?

MainActivity.java这是MainActivity类的代码。

package com.canvas.animacija.animacijasuncevogsistema;

import android.support.v7.app.AppCompatActivity;
i
mport android.os.Bundle;

public class MainActivity extends AppCompatActivity {

AnimationLayout animation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        animation = new AnimationLayout(this);

        setContentView(animation);
    }

    @Override
    protected void onPause() {
        super.onPause();
        animation.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        animation.resume();
    }
}

AnimationLayout.java这是AnimationLayout类的代码。

package com.canvas.animacija.animacijasuncevogsistema;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class AnimationLayout extends SurfaceView implements Runnable {

    Thread thread;
    boolean canDraw;

    Canvas canvas;
    SurfaceHolder holder;

    Paint yellow_fill_and_stroke, red_fill, green_fill, blue_fill, magenta_fill;

    int circle1_x, circle1_y, circle2_x, circle2_y, circle3_x, circle3_y, circle4_x, circle4_y,
            circle5_x, circle5_y;
    int radius1, radius2, radius3, radius4, radius5;

    public AnimationLayout(Context context) {
        super(context);

        thread = null;
        canDraw = false;

        holder = getHolder();

        circle1_x = toPxs(180);
        circle1_y = toPxs(250);
        radius1 = toPxs(30);

        circle2_x = toPxs(180);
        circle2_y = toPxs(240) - radius1;
        radius2 = toPxs(7);

    }

    @Override
    public void run() {

        prepareBrushes();

        while (canDraw) {

            if (!holder.getSurface().isValid()) {
                continue;
            }

            canvas = holder.lockCanvas();
            canvas.drawCircle(circle1_x, circle1_y, radius1, yellow_fill_and_stroke);
            canvas.drawCircle(circle2_x, circle2_y, radius2, red_fill);
            moveToRight(circle2_x, circle2_y, radius2, 10);
            holder.unlockCanvasAndPost(canvas);

        }

    }

    public void pause() {

        canDraw = false;

        while (true) {
            try {
                thread.join();
                break;
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
        }

        thread = null;

    }

    public void resume() {

        canDraw = true;
        thread = new Thread(this, "Animation Thread");
        thread.start();

    }

    private void prepareBrushes() {
        yellow_fill_and_stroke = new Paint();
        yellow_fill_and_stroke.setColor(Color.YELLOW);
        yellow_fill_and_stroke.setStyle(Paint.Style.FILL_AND_STROKE);
        yellow_fill_and_stroke.setStrokeWidth(toPxs(3));

        red_fill = new Paint();
        red_fill.setColor(Color.RED);
        red_fill.setStyle(Paint.Style.FILL);

        green_fill = new Paint();
        green_fill.setColor(Color.GREEN);
        green_fill.setStyle(Paint.Style.FILL);

        blue_fill = new Paint();
        blue_fill.setColor(Color.BLUE);
        blue_fill.setStyle(Paint.Style.FILL);

        magenta_fill = new Paint();
        magenta_fill.setColor(Color.MAGENTA);
        magenta_fill.setStyle(Paint.Style.FILL);
    }

    private int toPxs(int dps) {
        return (int) (dps * getResources().getDisplayMetrics().density);
    }

    private void moveToRight(int coordinate_x, int coordinate_y, int radius, int speed) {
        int d_speed = toPxs(speed);

        if (coordinate_x >= coordinate_y - radius/2 && coordinate_y >= coordinate_x + radius/2 ) {
            coordinate_x += d_speed;
            coordinate_y += d_speed;
        }

        if (coordinate_x >= coordinate_y + radius/2 && coordinate_y < coordinate_x + radius/2) {
            coordinate_x -= d_speed;
            coordinate_y += d_speed;
        }

        if (coordinate_x < coordinate_y + radius/2 && coordinate_y >= coordinate_x - radius/2) {
            coordinate_x -= d_speed;
            coordinate_y -= d_speed;
        }

        if (coordinate_x < coordinate_y - radius/2 && coordinate_y < coordinate_x - radius/2) {
            coordinate_x += d_speed;
            coordinate_y -= d_speed;
        }
    }
}
java android canvas
1个回答
0
投票

圆周运动需要三角函数。尝试类似的东西:

while (true)
{
    angle += increment;
    x = cos(angle) * radius;
    y = sin(angle) * radius;
    // redraw circle
}
© www.soinside.com 2019 - 2024. All rights reserved.