【问题标题】:How does animation exactly work in java? [closed]动画在java中究竟是如何工作的? [关闭]
【发布时间】:2016-05-13 03:46:57
【问题描述】:

我不太确定人们如何在 java 中创建动画,例如在屏幕上平移一个正方形。当我尝试使用 for 循环更改矩形的位置时,一切都会立即执行,最终得到矩形的结束坐标。所以我想知道的是人们如何实现这些平滑的动画超时,如果我想创建我的自定义动画类,无论出于何种原因,我将如何添加延迟以使其显示为动画而不是 java 中的即时位置变化?

【问题讨论】:

  • 简而言之:每隔几毫秒运行类似rectangle.x = (System.currentTimeInMillis() - startTimeInMillis) * 0.5 + 10; 的东西。或者只是每隔几毫秒运行一次rectangle.x += 2;
  • 嘿,谢谢。我如何每毫秒执行一次 rectangle.x 而不会导致线程休眠或侵犯其他事件的执行?
  • 你需要了解并发。本质上,您有一个在后台运行的线程/计时器,它向观察者发送通知,观察者根据他们的要求更新其状态,然后将其呈现到屏幕上(在一个单独的线程中,通常称为事件调度线程)。您最终实现这一目标的方法将取决于您使用的框架
  • 对于exampleexampleexample。动画是一个复杂的例子 (for example),根据我的经验,你最好使用专用库来完成这些任务
  • 哇,我想我现在有点明白了。所以为了做一些这样的动画并且仍然听用户,我需要有不同的线程对吗?但是这样不是很方便吗?如果我有多个动画需要运行,但由于动画时间不同,一个线程无法运行所有动画怎么办?这是否意味着我必须为这些多个动画使用更多线程?

标签: java animation


【解决方案1】:

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

代码(需要稍作调整以满足您的需求):

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

【讨论】:

  • 嘿,谢谢,但我有一个简单的问题。这个东西在单独的线程上运行对吗?如果我想做 10 个不同的动画,我需要 10 个线程才能工作吗?当我的计算机只有 8 个线程时,我该怎么做?我只是想测试一下。
  • 首先,你仍然可以在一台 8 核的机器上创建 10 个线程。计算机会将其抽象出来并在同一核心上并行运行线程。其次,您不必在单独的线程上运行它,但这是个好主意。
  • 请注意,根据框架,您可能会冒“ticker”和“renderer”之间的竞争条件(或者如果您在“event”线程中运行,请防止与用户界面)
  • @AnotherRandomUser 使用单个线程在恒定状态下生成滴答声,允许所有其他动画观察并相应地进行更改,TimingFramework 就是这样工作的。
【解决方案2】:

您可以使用 Thread.sleep(long millis) 方法添加延迟,该方法将在指定的毫秒数内暂停当前线程的执行。不过可能有更好的方法。

【讨论】:

  • 嘿,谢谢你的回答,但我不太确定 thread.sleep 是最好的选择,因为可以说你正在创建一个菜单,对吧?如果您告诉线程休眠某些动画,但如果它休眠了,它将如何响应用户点击?
  • 我不相信它能够在睡眠时注册用户的点击。
  • 是的,我想是的。我一直在尝试用谷歌搜索如何做到这一点,但到目前为止我一无所获,我已经搜索了一个多小时才来到这里并提出问题。
  • @DogeOverlord 这假设很多,如果你在框架的“主”或“事件”线程中调用Thread.sleep,那么是的,它会导致 UI 停止响应
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2023-04-01
  • 2021-07-03
  • 2011-06-26
相关资源
最近更新 更多