Java 摆动动画
Java swing animation
我正在尝试使用 java swing 制作翻转效果,但我的翻转方法看起来不像真实的 flip.In 我的方法我使用 x var 和xspeed,使图像变小,然后检查 x 是否 >= 作为我图像的一半。希望有人可以帮助我改进它,在此先感谢。
动画Class
public class Animation extends JPanel implements MouseListener {
private static final long serialVersionUID = 3264508834913061718L;
public Timer timer;
public int x = 0;
public int xspeed = 2;
public boolean turning = true;
public String pic = "/images/image.jpg";
public URL url = this.getClass().getResource(pic);
public ImageIcon im = new ImageIcon(url);
public String rev = "/images/image2.jpg";
public URL url2 = this.getClass().getResource(rev);
public ImageIcon reverse = new ImageIcon(url2);
public Animation(){
this.setPreferredSize(new Dimension(128,128));
this.setBackground(Color.BLACK);
this.setFocusable(true);
this.addMouseListener(this);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(im.getImage(), 0 , 0, im.getIconWidth() - x, im.getIconHeight(), null);
}
public void flipAnimation(){
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//
if (turning) {
x = x + xspeed;
}
repaint();
// x in the middle paint new image & set turning to false to stop animation
if(x >= im.getIconWidth()/2){
turning = false;
x = 0;
im = reverse;
}
}
};
if (turning) {
if (timer != null)timer.stop();
timer = new Timer(30, actionListener);
timer.start();
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
e.getSource();
flipAnimation();
}
首先,我猜您希望图像从两侧“折叠”,因此您需要增加图像的左边缘和右边缘:
g.drawImage(im.getImage(), x / 2 , 0, im.getIconWidth() - x, im.getIconHeight(), this);
请注意,第一个 int 参数已从 0
更改为 x / 2
。此外,在 paintComponent 方法中绘制图像时,将 this
作为 ImageObserver 参数传递是一种很好的做法,因为当图像在后台加载完成时,组件本身是有兴趣重新绘制自身的对象。
其次,改变这个:
if (turning) {
x = x + xspeed;
}
对此:
x = x + xspeed;
您不需要标志来控制动画。 (停止动画的正确方法是调用 timer.stop(),我稍后会讲到。)
第三,改变这个:
if(x >= im.getIconWidth()/2){
turning = false;
x = 0;
对此:
if(x >= im.getIconWidth()){
xspeed = -xspeed;
- 正如我所说,不需要
turning
标志。
- 之所以将
x
与图像的宽度进行比较,而不是宽度的一半,是因为我们只想在第一张图像完全“折叠”时才更改图像。
xspeed
的否定反转动画。
最后,在 actionPerformed 方法的末尾,您需要添加以下内容:
if (x <= 0) {
timer.stop();
}
这会在反转图像达到其完整大小时停止动画,这就是不需要 turning
标志的原因。
我正在尝试使用 java swing 制作翻转效果,但我的翻转方法看起来不像真实的 flip.In 我的方法我使用 x var 和xspeed,使图像变小,然后检查 x 是否 >= 作为我图像的一半。希望有人可以帮助我改进它,在此先感谢。
动画Class
public class Animation extends JPanel implements MouseListener {
private static final long serialVersionUID = 3264508834913061718L;
public Timer timer;
public int x = 0;
public int xspeed = 2;
public boolean turning = true;
public String pic = "/images/image.jpg";
public URL url = this.getClass().getResource(pic);
public ImageIcon im = new ImageIcon(url);
public String rev = "/images/image2.jpg";
public URL url2 = this.getClass().getResource(rev);
public ImageIcon reverse = new ImageIcon(url2);
public Animation(){
this.setPreferredSize(new Dimension(128,128));
this.setBackground(Color.BLACK);
this.setFocusable(true);
this.addMouseListener(this);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(im.getImage(), 0 , 0, im.getIconWidth() - x, im.getIconHeight(), null);
}
public void flipAnimation(){
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//
if (turning) {
x = x + xspeed;
}
repaint();
// x in the middle paint new image & set turning to false to stop animation
if(x >= im.getIconWidth()/2){
turning = false;
x = 0;
im = reverse;
}
}
};
if (turning) {
if (timer != null)timer.stop();
timer = new Timer(30, actionListener);
timer.start();
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
e.getSource();
flipAnimation();
}
首先,我猜您希望图像从两侧“折叠”,因此您需要增加图像的左边缘和右边缘:
g.drawImage(im.getImage(), x / 2 , 0, im.getIconWidth() - x, im.getIconHeight(), this);
请注意,第一个 int 参数已从 0
更改为 x / 2
。此外,在 paintComponent 方法中绘制图像时,将 this
作为 ImageObserver 参数传递是一种很好的做法,因为当图像在后台加载完成时,组件本身是有兴趣重新绘制自身的对象。
其次,改变这个:
if (turning) {
x = x + xspeed;
}
对此:
x = x + xspeed;
您不需要标志来控制动画。 (停止动画的正确方法是调用 timer.stop(),我稍后会讲到。)
第三,改变这个:
if(x >= im.getIconWidth()/2){
turning = false;
x = 0;
对此:
if(x >= im.getIconWidth()){
xspeed = -xspeed;
- 正如我所说,不需要
turning
标志。 - 之所以将
x
与图像的宽度进行比较,而不是宽度的一半,是因为我们只想在第一张图像完全“折叠”时才更改图像。 xspeed
的否定反转动画。
最后,在 actionPerformed 方法的末尾,您需要添加以下内容:
if (x <= 0) {
timer.stop();
}
这会在反转图像达到其完整大小时停止动画,这就是不需要 turning
标志的原因。