Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
动画在java中究竟是如何工作的?_Java_Animation - Fatal编程技术网

动画在java中究竟是如何工作的?

动画在java中究竟是如何工作的?,java,animation,Java,Animation,我不太清楚人们到底是如何用java创建动画的,比如在屏幕上翻译一个正方形。当我尝试使用for循环更改矩形的位置时,所有内容都会立即执行,最后得到矩形的端点坐标。因此,我想知道的是,人们是如何超时实现这些平滑动画的,如果我出于任何原因想创建自定义动画类,我将如何添加延迟以使其显示为动画,而不是java中的即时位置更改?您可以使用Thread.sleep(长毫秒)方法添加延迟它将按指定的毫秒数停止当前线程的执行。不过,可能还有更好的方法。您可以简单地存储矩形的x和y位置。然后运行while循环,检查

我不太清楚人们到底是如何用java创建动画的,比如在屏幕上翻译一个正方形。当我尝试使用for循环更改矩形的位置时,所有内容都会立即执行,最后得到矩形的端点坐标。因此,我想知道的是,人们是如何超时实现这些平滑动画的,如果我出于任何原因想创建自定义动画类,我将如何添加延迟以使其显示为动画,而不是java中的即时位置更改?

您可以使用Thread.sleep(长毫秒)方法添加延迟它将按指定的毫秒数停止当前线程的执行。不过,可能还有更好的方法。

您可以简单地存储矩形的x和y位置。然后运行while循环,检查是否经过了给定的时间。如果有,则增加位置变量

代码(需要轻微调整以满足您的需要):


嘿,谢谢你的回答,但我不太确定线程。睡眠是最好的选择,因为我们说你正在创建一个菜单,对吗?如果你告诉线程睡眠一些动画,但是如果它睡眠,它将如何响应用户的点击呢?我不相信它能够在用户睡眠时注册用户的点击。是的,我想是的。我一直在尝试用谷歌搜索如何做到这一点,但到目前为止我什么也没找到,我已经搜索了一个多小时才来到这里问这个问题。@DogeOverlord如果你在框架的“main”或“event”线程中调用
Thread.sleep
,那就可以了,简而言之,它将导致UI停止响应:运行类似于
rectangle.x=(System.currentTimeInMillis()-startTimeInMillis)*0.5+10的东西每隔几毫秒。或者只是运行
rectangle.x+=2每隔几毫秒。嘿,谢谢。如何每毫秒执行一次矩形.x,而不会导致线程休眠或侵犯其他事件的执行?您需要了解并发性。本质上,您有一个线程/计时器,它在后台滴答作响,向观察者发送通知,根据他们的要求更新他们的状态,然后呈现到屏幕上(在一个单独的线程中,通常称为事件调度线程)。最终实现这一目标的方法取决于您使用的框架。动画是一个复杂的例子(),根据我的经验,你最好使用dedictated库来完成这些任务,我想我现在有点明白了。所以,为了做一些像那样的动画,仍然听用户,我需要有不同的线程对吗?但这不是很方便吗?如果我需要运行多个动画,但由于动画计时不同,线程无法运行所有动画,该怎么办?这是否意味着我必须为这些多个动画使用更多的线程?嘿,这很有效,谢谢,但我有一个快速的问题。这东西是在一个单独的线程上运行的,对吗?如果我想做10个不同的动画,我需要10个线程吗?如果我的电脑只有8个线程,我该怎么做?我只是想测试一下。首先,你仍然可以在一台8核的机器上创建10个线程。计算机将把它提取出来,并在同一个内核上并行运行线程。第二,您不必在单独的线程上运行,但这是一个好主意。请注意,根据框架的不同,您可能会面临“ticker”和“renderer”之间的竞争条件风险(或者,如果您在“event”线程中运行,则会阻止与UI的进一步交互)@另一个用户使用一个线程,该线程在恒定状态下生成滴答声,允许所有其他动画观察并相应地进行更改,计时框架就是这样工作的。
int tick = 500; //set this to whatever you want
long lastTime = System.currentTimeInMillis();
while(true) {
 long currTime = System.currentTimeInMillis();
 if (currTime > lastTime + tick) {
  lastTime = currTime;
  x = x + 1; //replace this with your object's position
 }
}