Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android以弧形移动图像视图_Android_Android Animation - Fatal编程技术网

android以弧形移动图像视图

android以弧形移动图像视图,android,android-animation,Android,Android Animation,我们想使用sin&cos在两个弧形中移动图像视图,其中的形状类似于NFL足球的外围。下面是我们不太优雅的代码。这是可行的,但当我们尝试用正反方向解决这个动画时,第一个问题是坐标系,认为点0,0是屏幕的左上角,移动imageview并开始将其移出屏幕。我们试图通过各种方法来克服这一问题,但都没有奏效。我们知道X点和Y点的起点和终点,但不知道圆的半径。 所以问题一是如何让imageview处于正确的位置? 问题二是如何在顶部圆弧上移动imageview,然后沿底部圆弧返回起始位置。 我们在问题中使用

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

这是我们的工作代码

    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;
    }

}

实际上,我不确定您的代码是否那么优雅。利用正反两方面的因素使地球在其轨道上运行需要更多的思考和工作。也就是说,如果有人尝试这段代码,那么许多变量都是相互依赖的,这就不是我将要发布的理想结果。但它确实回答了这个问题 因此,我建议大家通过这个链接来理解这个主题

public void startName(视图){
earth.setVisibility(视图.可见);
地球。setX(60);
地球。塞蒂(520);
//创建并启动计时器。
定时器=新定时器();
handler=新的handler();
timer.schedule(新TimerTask(){
@凌驾
公开募捐{
handler.post(新的Runnable(){
@凌驾
公开募捐{
newORBIT();
}
});
}
}, 0, 500);
}
公共空间{
newTheta=newTheta+0.009;
半径=10;
newDeltaX=半径*数学cos(newTheta);
newDeltaY=半径*数学sin(newTheta);
地球自转(角度+=7.5f);
角度=地球。getRotation();
System.out.println(“角度”+角度);
如果(角度<82.5){
X=(浮动)新代尔税+60;
Y=(浮动)新德尔泰-18.75f;
}
如果(角度>82.5){
X=(浮动)新代尔税+60;
Y=(浮动)新三角洲+18.75f;
}
如果(角度>196){
X=(浮动)新代尔税-60;
Y=(浮动)新三角洲+18.75f;
}
如果(角度>330){
X=(浮动)新代尔税-60;
Y=(浮动)新德尔泰-18.75f;
}
如果(角度>457){
角度=0;
newTheta=0;
newDeltaX=0.0f;
newDeltaY=0.0f;
X=0;
Y=0;
地球自转(0);
地球。setX(60);
地球。塞蒂(520);
}
earth.setX(earth.getX()+X);
earth.setY(earth.getY()+Y);
}

您是如何确定这些值的newTheta=newTheta+0.009;半径=10@James_Duh太多的尝试和错误这其中最困难的部分是你使用的断点X坐标我使用的角度工作但太依赖于其他值上升和运行不太完美但你可以玩代码享受
    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);

}