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 标志的原因。