JAVA Swing“动画”:线程控制下的数字游戏
不妨写一个 JFrame
,每隔 30ms 增加 10px 的窗体横坐标,你会发现窗体有缓慢向右移动的动画效果。借此思路,可以创造更多的特效。如果写成通用的类,我想就可以像某些前端框架一样轻易的实现一些特效。
示例
Color
类中有三个参数 r
,g
,b
(第四个参数 a
不常用,但当然也可以加上)。Point
类中有两个参数 x
,y
。这些都可以用来制作特效。
Slider.java
是一个控制 Swing 组件移动的类。下面仅此类入口方法和关键方法。详见我的 Support 项目。
// ***
/**
* @see Slider
* @param c 操作对象
* @param direction 滑动方向 TOP|LEFT|BOTTOM|RIGHT
* @param px 滑动距离
* @param time 滑动时间(微秒)
* @param activity 任务(具体参见类注释)
* @return 在activity为RETURN时返回Slider对象
*/
public static Slider direct(Component c,int direction,int px,int time,int activity){
// 根据参数确定起始点,然后调用 doSlide 方法
//****
}
//***
/**
* 线程
* @param start 起始点
* @param finish 终点
*/
private void doSlide(final Point start,final Point finish){
// Java 8 lambda 语法
new Thread(()-> {
int time=times;
// 确定 x、y 值要增加还是减少
int xDir=start.x<=finish.x?1:-1;
int yDir=start.y<=finish.y?1:-1;
// 当前位置
float[]present={start.x,start.y};
on=true;
// 纵横方向上是否到达终点
boolean xFinish=false,yFinish=false;
while(on&&time==times){
try {
/** 睡眠 intervals 毫秒,这也是动画的关键
* 这个参数由 time 参数和起始点决定
*/
Thread.sleep(intervals);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 如果两个方向上都到达了终点,on = false ,程序终止
if(xFinish&&yFinish){
on=false;
c.setLocation(finish);
}
else{
// 设置下一个位置
c.setLocation((int)present[0],(int)present[1]);
if(!xFinish){
// 计算下一个横坐标
float distence=Math.abs(finish.x-present[0]);
if(distence>=breakX)
present[0]+=xSpeed*xDir;
else
present[0]+=present(distence,true)*xDir;
xFinish=xDir==1?present[0]>=finish.x:present[0]<=finish.x;
}
if(!yFinish){
// 计算下一个纵坐标
present[1]+=ySpeed*yDir;
float distence=Math.abs(finish.y-present[1]);
if(distence>=breakY)
present[1]+=ySpeed*yDir;
else
present[1]+=present(distence,false)*yDir;
yFinish=yDir==1?present[1]>=finish.y:present[1]<=finish.y;
}
}
}
}).start();
};
// ***
传入 Slider
的组件 c
将在 time
时间内在 direction
方向上移动 px
的距离。如果每个间隔都增加相同的增量,那么Slider移动组件就是在“匀速行驶”,如果加入数学或者物理公式,就能让组件按数学曲线或者物理的方式移动
为什么标题说是数字游戏?
很简单啦,这不过是数字的加加减减而已
为什么标题说是线程控制下的?
程序是顺序执行的。所以“执行”动画的程序必须要放进新开辟的线程中。开辟线程可用 Java 8
的 lambda
语法,如上例。
总结
很多数字控制的东西,都可以做成特效。比如,背景色、前景色、窗体的透明度、图片旋转角、图片倾斜度等等。
详见我的 Support 项目。这个项目除此之外还规划包含了操作 Swing、文件、数学、其他的工具类,目前为暂停状态。