1

对不起,我是一个菜鸟,我已经阅读了无数关于制作简单计时器的教程,并且想知道为什么它不起作用,直到我注意到它是导致问题的 while 循环 oO 我已经删除它然后它可以工作但只有 1 次我需要使用循环所以运动完成:C

继承人的代码:

old_x 是来自 ImageView 的坐标,而 new_x 来自 onTouch 事件,可能是因为我将它们转换为 int 的问题?我不知道我需要做什么才能工作,请帮助 O:

    while(old_x != new_x)
    {
        timedMoveIV(100);
        old_x = (int)img.getX();
    }

如果我在没有循环的情况下执行此操作,它会调用此方法。

public void timedMoveIV(int time_ms)
{
    //sleep for time_ms milliseconds
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
         public void run() { 
            if(new_x > img.getX())
            {
            img.setX(img.getX() + 1);
            }
            else
            {
            img.setX(img.getX() - 1);   
            }
         } 
    }, time_ms);
}
4

1 回答 1

5

您的主要问题是您的循环不会中断,因此它会不断运行该函数,并发布大量可运行文件。

您要做的是在另外 100 毫秒后自行调用 runnable。看看这个例子:

if(old_x != new_x)
    timedMoveIV(100);

在这里,您只需调用该函数一次。之后,您让发布的 runnable 决定它是否需要再次移动:

public void timedMoveIV(final int time_ms)
{
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
        public void run() 
        { 
            if(new_x > img.getX())
                img.setX(img.getX() + 1);
            else
                img.setX(img.getX() - 1); 

            // if not in position, call again
            if((int)img.getX() != new_x)
                timedMoveIV(time_ms); 
        } 
    }, time_ms);
}

它应该停止一次img.getX() == new_x。但是请注意转换为int,因为如果您将其排除在外,您可能会在它到达目标像素的范围内时出现一些振荡。

这假设new_x是一个int. 如果它也是一个浮点数,您应该将两者都转换为 int 进行比较,或者将它们与最小阈值进行比较。例如,如果差异小于0.5差异,则将其视为“完成”。

于 2013-03-03T06:35:29.590 回答