[java]过渡动画实现

最近想做一个过渡动画的效果,简单一个小动物从一个点走到另一个点

可是在编辑代码的时候发现无法实现沿着路线慢慢向上移动,这是开始的代码

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;


public class test extends JFrame {

static JLabel lab = new JLabel("英雄");
static JFrame frm = new JFrame();
static JTextArea win = new JTextArea(1,20);
int x,y;
test()
{
frm.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent arg0) {
x = arg0.getX();
y = arg0.getY();
int lx = lab.getX();
int ly = lab.getY();
win.setText("("+x+","+y+")"+"("+lx+","+ly+")");
while (Math.abs(lx-x)<=10)
{
if (lx
lx+=5;
lab.setLocation(lx, ly);
}
lab.setLocation(x, y);
}});
lab.setBounds(1,1,30,80);
frm.setSize(400,400);
frm.setLayout(null);
frm.add(lab);
frm.setVisible(true);
frm.setResizable(false);
}
public static void main(String[] args)
{
new test();
}
}

分析原因:
在适配器中的while体内代码并没有被执行,猜测是在主线程中由于点击鼠标适配器不能接受while的长时间反应造成的堵塞,尝试使用多线程解决
修改后的代码:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class test extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 486449053424724717L;
	static JLabel lab = new JLabel();
	static JFrame frm = new JFrame();
	static JLabel lab2 = new JLabel("请点击屏幕移动:");
	static JLabel lab3 = new JLabel("");
	static ImageIcon icon1 = new ImageIcon("u=3916751631,2282980909&fm=21&gp=0.jpg.gif");
	static ImageIcon icon2 = new ImageIcon("aa.gif");
	static ImageIcon icon3 = new ImageIcon("s2.gif");
	static ImageIcon icon4 = new ImageIcon("s1.gif");
	static ImageIcon ticon = new ImageIcon("u=1079754548,2185157290&fm=90&gp=0.jpg");
	int x,y,ax,ay;
	test()
	{
		frm.addMouseListener(new MouseAdapter() {
			public void mousePressed(final MouseEvent arg0) {
				new Thread (new Runnable() {
					public void run() {
						x = arg0.getX();
						y = arg0.getY()-30;
						ax = lab.getX();
						ay = lab.getY();
						lab3.setText("十");
						lab3.setLocation(x-5, y-5);
						int rec=ax;
						if (x-40<rec)
							lab.setIcon(icon1);
						else
							lab.setIcon(icon2);
						x-=60;
						y-=60;
						while (Math.abs(x-ax)>=2 || Math.abs(y-ay)>=2)
						{
							if (ax<x)
								ax+=1;
							else if (ax>x)
								ax-=1;
							if (ay<y)
								ay+=1;
							else if (ay>y)
								ay-=1;
							try {
								Thread.sleep(5);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
							lab.setLocation(ax, ay);
						}
						if (x-40<rec)
							lab.setIcon(icon4);
						else
							lab.setIcon(icon3);
						lab3.setText("");
					}
				}).start();
				
				
			}
		});
		frm.setTitle("冰");
		frm.setIconImage(ticon.getImage());
		frm.setBounds(100,100,1000,600);
		lab.setBounds(500, 250, 120, 120);
		lab2.setBounds(460, 1, 120, 20);
		lab3.setBounds(1,1,120,20);
		frm.setLayout(null);
		frm.add(lab3);
		frm.add(lab2);
		frm.add(lab);
		frm.setVisible(true);
		frm.setResizable(false);
	}
	
	public static void main(String[] args)
	{
		new test();
	}
	

}

在适配器中建立线程,当主线程被堵塞的时候运行,可以达到要求。

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试