Java动画实现与Timing框架基础
立即解锁
发布时间: 2025-08-18 00:50:47 阅读量: 1 订阅数: 4 

# Java动画实现与Timing框架基础
## 1. SmoothMoves演示项目
### 1.1 项目概述
SmoothMoves演示项目展示了Swing和Java 2D图形与动画的功能。在渲染前,应用程序会创建要渲染到屏幕的图形对象,之后启动定时器运行动画循环,最后进行图形渲染。
### 1.2 创建图形对象
创建图形对象时,应用程序会创建一个图像,该图像将在动画期间使用`drawImage()`方法进行复制。默认情况下,图像内容是一个实心黑色矩形。以下是创建图像的代码:
```java
void createAnimationImage() {
GraphicsConfiguration gc = getGraphicsConfiguration();
image = gc.createCompatibleImage(imageW, imageH,
Transparency.TRANSLUCENT);
Graphics gImg = image.getGraphics();
gImg.setColor(Color.BLACK);
gImg.fillRect(0, 0, imageW, imageH);
gImg.dispose();
}
```
操作步骤如下:
1. 从组件获取`GraphicsConfiguration`对象,用于创建兼容图像。
2. 创建一个半透明的图像。
3. 获取图像的`Graphics`对象,设置颜色为黑色,并填充矩形。
4. 释放`Graphics`对象。
### 1.3 运行定时器
启动定时器以运行动画循环,代码如下:
```java
private void startTimer(int resolution) {
if (timer != null) {
timer.stop();
timer.setDelay(resolution);
} else {
timer = new Timer(resolution, this);
}
timer.start();
}
```
操作步骤如下:
1. 如果定时器已存在,停止定时器并设置新的延迟时间。
2. 如果定时器不存在,创建一个新的定时器,并设置延迟时间和`ActionListener`。
3. 启动定时器。
定时器会按设置的分辨率调用`actionPerformed()`方法,该方法会计算动画已完成的比例,并调用`animate()`方法:
```java
public void actionPerformed(ActionEvent ae) {
long currentTime = System.nanoTime() / 1000000;
long totalTime = currentTime - cycleStart;
if (totalTime > CYCLE_TIME) {
cycleStart = currentTime;
}
float fraction = (float)totalTime / CYCLE_TIME;
fraction = Math.min(1.0f, fraction);
fraction = 1 - Math.abs(1 - (2 * fraction));
animate(fraction);
}
```
`animate()`方法会根据计算出的比例改变对象的透明度和位置,并调用`repaint()`方法进行重绘:
```java
public void animate(float fraction) {
opacity = fraction;
int prevMoveX = moveX;
moveX = moveMinX + (int)(.5f + fraction *
(float)(moveMaxX - moveMinX));
repaint();
}
```
### 1.4 渲染图形
在`paintComponent()`方法中,有三个主要任务:擦除背景、绘制淡入淡出动画和绘制移动动画。
#### 1.4.1 擦除背景
将背景擦除为白色:
```java
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
```
#### 1.4.2 绘制淡入淡出动画
使用`animate()`方法计算的透明度值创建`AlphaComposite`对象,并设置到`Graphics2D`对象上,然后渲染图像:
```java
Graphics2D gFade = (Graphics2D)g.create();
gFade.setComposite(AlphaComposite.SrcOver.derive(opacity));
gFade.drawImage(image, fadeX, fadeY, null);
gFade.dispose();
```
#### 1.4.3 绘制移动动画
将图像复制到指定位置:
```java
g.drawImage(image, moveX, moveY, null);
```
### 1.5 渲染选项
在应用程序运行时,可以使用键盘命令尝试不同的渲染方法,以减轻动画的卡顿现象。以下是一些选项:
| 按键 | 功能 |
| ---- | ---- |
| I | 在实心矩形和图像之间切换渲染对象 |
| C | 在默认黑色和浅灰色之间切换颜色 |
| B | 切换简单的运动模糊效果 |
| 1 - 9 | 切换运动模糊的长度 |
| A | 切换抗锯齿功能 |
| 上下箭头 | 增加或减少动画的帧率 |
| L | 切换动画的插值模式 |
## 2. Timing Framework基础
### 2.1 框架概述
Timing Framework是一组实用类,提供了更强大的动画系统,可处理许多在应用程序中原本需要自己实现的细节。其设计动机有两个方面:处理常见任务和提供简单的API。
### 2.2 核心概念
Timing Framework的核心类中包含以下关键概念和属性:
- **Animator**:封装了大部分功能,用于创建和运行动画。
- **Callbacks**:通过回调机制通知应用程序动画期间的事件。
- **Duration**:定义动画的持续时间。
- **Repetition**:控制动画的重复次数和行为。
- **Resolution**:控制动画的帧率。
- **Starting behavior**:控制动画的起始延迟、方向和初始比例。
- **Ending behavior**:控制动画结束时的行为。
- **Interpolation**:可应用不同的插值方法使动画具有非线性行为。
### 2.3 Animator类
#### 2.3.1 创建Animator
Animator通过以下三种构造方法创建:
```java
Animator(int duration)
Animator(int duration, TimingTarget target)
Animator(int duration, double repeatCount,
Animator.RepeatBehavior repeatBehavior,
TimingTarget target)
```
操作步骤如下:
1. `Animator(int duration)`:仅设置动画的持续时间,需要后续通过`addTarget()`方法添加`TimingTarget`对象。
2. `Animator(int duration, TimingTarget target)`:设置动画的持续时间和`TimingTarget`对象。
3. `Animator(int duration, double repeatCount, Animator.RepeatBehavior repeatBehavior, TimingTarget target)`:设置动画的持续时间、重复次数、重复行为和`TimingTarget`对象。
#### 2.3.2 控制动画流程
Animator提供了以下方法来控制动画的运行和停止:
```java
void start()
void stop()
void cancel()
void pause()
void resume()
boolean isRunning()
```
操作步骤如下:
1. `start()`:启动动画,会调用`TimingTarget`的`begin()`和`timingEvent()`方法。
2. `stop()`:停止动画,会调用`TimingTarget`的`end()`方法。
3. `cancel()`:取消动画,不会调用`TimingTarget`的`end()`方法。
4. `pause()`:暂停运行中的动画。
5. `resume()`:恢复已暂停的动画。
6. `isRunning()`:查询动画是否正在运行。
### 2.4 回调机制
#### 2.4.1 TimingTarget接口
`TimingTarget`接口定义了四个事件方法:
```java
public interface TimingTarget {
public void begin();
public void end();
public void repeat();
public void timingEvent(float fraction);
}
```
- `begin()`:动画开始时调用,可用于进行必要的设置。
- `end()`:动画结束时调用,可用于进行必要的清理操作。
- `repeat()`:重复动画开始新的一轮时调用。
- `timingEvent(float fraction)`:提供动画已完成的比例,可用于改变动画期间的属性值。
#### 2.4.2 TimingTargetAdapter类
`TimingTargetAdapter`类是`TimingTarget`接口的简单实现,提供了空方法,方便子类只接收特定的事件。
### 2.5 其他属性
#### 2.5.1 持续时间(Duration)
动画的持续时间可以通过`Animator`的构造方法或`setDuration(int duration)`方法设置,单位为毫秒。还可以设置为`Animator.INFINITE`,表示动画将无限运行。
#### 2.5.2 重复(Repetition)
通过以下方法控制动画的重复次数和行为:
```java
Animator(int duration, double repeatCount,
Animator.RepeatBehavior repeatBehavior,
TimingTarget target)
void setR
```
0
0
复制全文
相关推荐










