首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用AffineTransform制作动画

用AffineTransform制作动画
EN

Stack Overflow用户
提问于 2015-12-11 13:30:16
回答 1查看 365关注 0票数 0

我需要帮助使用AffineTransform翻译来创建简单的动画。

基本上,我已经导入了一个图片,我一直在尝试使用仿射变换为图片创建简单的摇动动画(图片将不断地向上和向下移动一点点,不间断)。

虽然我很感激是否有其他简单的方法,但我需要在这个过程中使用仿射变换。

我应该使用什么功能来延迟?曾经尝试使用计时器,但由于我缺乏理解,仍然失败。非常简单的代码示例会有帮助,谢谢!

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-11 15:25:08

下面是一个相当简单的例子。阅读setTransform方法的javadoc,您应该看到不应该创建新的AffineTransform,而应该使用图形上下文中的一个。

代码语言:javascript
复制
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();
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34224715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档