android在弧形中移动图像视图

时间:2018-02-08 21:28:36

标签: android android-animation

我们想使用sin& cos将镜像视图移动到两个弧形中,其形状就像NFL橄榄球的外围。我们不太优雅的代码如下。它可以工作但是当我们尝试使用sin和cos来解决这个动画时,第一个问题是坐标系认为点0,0是屏幕的左上角并移动图像视图并开始将其移出屏幕。我们试图通过各种方法来解决这个问题。我们知道开始和停止X和Y点,但不知道圆的半径。 问题一是如何将imageview放在正确的位置? 问题二是如何在顶部圆弧上移动图像视图,然后沿底部圆弧返回到起始位置。 我们在问题中使用了Android,因为这不是数学或JavaFX问题 请理解我们知道这是关于在Android中使用sin和cos实现它的数学。 此链接已关闭cos & sin use

这是我们的工作代码

    public void startGAME(View view){

    earth.setVisibility(View.VISIBLE);
    earth.setX(60);
    earth.setY(520);
    // Create and Start the timer.
    timer = new Timer();
    handler = new Handler();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    orbitEARTH();
                }
            });
        }
    }, 0, 500);
}

public void orbitEARTH(){

    if(earth.getX() == 828){
        number = 2;
    }
    if(earth.getX() == 1884){
        number = 3;
    }
    if(earth.getX() == 914){
        number = 4;
    }
    if(earth.getX() == 41){
        earth.setX(60);
        earth.setY(520);
        number = 1;
    }

    switch (number) {
        case 1:
            xPos = (int) (earth.getX()+96);
            yPos = (int) (earth.getY()-30);
            earth.setX(xPos);
            earth.setY(yPos);
            System.out.println("##### 1 xPos"+xPos+" yPos "+yPos);
            break;
        case 2:
            xPos = (int) (earth.getX()+96);
            yPos = (int) (earth.getY()+30);
            earth.setX(xPos);
            earth.setY(yPos);
            System.out.println("##### 2 xPos"+xPos+" yPos "+yPos);
            break;
        case 3:
            xPos = (int) (earth.getX()-97);
            yPos = (int) (earth.getY()+30);
            earth.setX(xPos);
            earth.setY(yPos);
            System.out.println("##### 3 xPos"+xPos+" yPos "+yPos);
            break;

        case 4:
            xPos = (int) (earth.getX()-97);
            yPos = (int) (earth.getY()-30);
            earth.setX(xPos);
            earth.setY(yPos);
            System.out.println("##### 4 xPos"+xPos+" yPos "+yPos);
            break;
    }

}

1 个答案:

答案 0 :(得分:1)

在所有现实中,我不确定你的代码是不是那么优雅。使用sin和cos来移动地球轨道需要更多的思考和工作。也就是说,如果任何人尝试这个代码,那么很多变量都是相互依赖的,那就不太理想了我要发布的内容。但它确实回答了这个问题 所以我建议按照这个链接来掌握主题

Math

    public void startGAME(View view){

    earth.setVisibility(View.VISIBLE);
    earth.setX(60);
    earth.setY(520);
    // Create and Start the timer.
    timer = new Timer();
    handler = new Handler();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    newORBIT();
                }
            });
        }
    }, 0, 500);
}

public void newORBIT(){
    newTheta = newTheta + 0.009;
    radius = 10;
    newDeltaX = radius*Math.cos(newTheta);
    newDeltaY = radius*Math.sin(newTheta);
    earth.setRotation(ANGLE += 7.5f);
    ANGLE = earth.getRotation();
    System.out.println("############# Angle "+ANGLE);
    if(ANGLE < 82.5) {
        X = (float) newDeltaX + 60;
        Y = (float) newDeltaY - 18.75f;
    }

    if(ANGLE > 82.5){
        X = (float) newDeltaX + 60;
        Y = (float) newDeltaY + 18.75f;
    }
    if(ANGLE > 196){
        X = (float) newDeltaX - 60;
        Y = (float) newDeltaY + 18.75f;
    }
    if(ANGLE > 330){
        X = (float) newDeltaX - 60;
        Y = (float) newDeltaY - 18.75f;
    }
    if(ANGLE > 457){
        ANGLE = 0;
        newTheta = 0;
        newDeltaX = 0.0f;
        newDeltaY = 0.0f;
        X = 0;
        Y = 0;
        earth.setRotation(0);
        earth.setX(60);
        earth.setY(520);
    }
    earth.setX(earth.getX()+X);
    earth.setY(earth.getY()+Y);

}