我需要帮助使用AffineTransform翻译来创建简单的动画。
基本上,我已经导入了一个图片,我一直在尝试使用仿射变换为图片创建简单的摇动动画(图片将不断地向上和向下移动一点点,不间断)。
虽然我很感激是否有其他简单的方法,但我需要在这个过程中使用仿射变换。
我应该使用什么功能来延迟?曾经尝试使用计时器,但由于我缺乏理解,仍然失败。非常简单的代码示例会有帮助,谢谢!
Public void paint(Graphics g){
super.paint(g);
Graphics2D gpcs= (Graphics2D) g;
gpcs.drawImage(logo, 0, 40, 250, 75, null);
AffineTransform at = new AffineTransform();
at.translate(0, 10);
gpcs.setTransform(at);
}发布于 2015-12-11 15:25:08
下面是一个相当简单的例子。阅读setTransform方法的javadoc,您应该看到不应该创建新的AffineTransform,而应该使用图形上下文中的一个。
public class Shake extends JComponent
{
private static final long serialVersionUID = 1L;
private static Image logo = null;
private static double SHAKE_MAX_X = 20;
private static double SHAKE_MAX_Y = 20;
private static double SHAKE_X = 0;
private static double SHAKE_Y = 0;
private static double SHAKE_TIME = 50;
private static long ELAPSED_TIME = 0;
private static long LAST_TIME = 0;
private static Random rnd = new Random();
public static void main(String[] args)
{
logo = Toolkit.getDefaultToolkit().getImage("C:\\some_logo.jpg");
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setBounds(30, 30, 640, 480);
final Shake shake = new Shake();
window.getContentPane().add(shake);
window.setVisible(true);
int delay = 20; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
shake.repaint();
}
};
new Timer(delay, taskPerformer).start();
}
public void paint(Graphics g)
{
super.paint(g);
Graphics2D gpcs= (Graphics2D) g;
updateShake();
AffineTransform at = gpcs.getTransform();
at.translate(SHAKE_X, SHAKE_Y);
gpcs.setTransform(at);
gpcs.drawImage(logo, 0, 40, 250, 75, null);
gpcs.finalize();
}
public void updateShake()
{
ELAPSED_TIME += System.currentTimeMillis() - LAST_TIME;
if (ELAPSED_TIME > SHAKE_TIME)
{
ELAPSED_TIME = 0;
SHAKE_X = rnd.nextDouble() * SHAKE_MAX_X;
SHAKE_Y = rnd.nextDouble() * SHAKE_MAX_Y;
}
LAST_TIME = System.currentTimeMillis();
}
}https://stackoverflow.com/questions/34224715
复制相似问题