2012-11-27 2 views
0

버튼을 클릭하여 속도를 높이고 속도를 낮추고 싶은 애니메이션이 있습니다. 저는 꽤 많이 둘러 보았고 해결책을 찾지 못했습니다. 현재 지연 변수의 값을 변경하고 타이머를 다시 시작하는 버튼에 대한 actionlistener가 있습니다.버튼으로 Java 타이머 변경 지연

누구든지 조언 해 주실 수 있습니까? 감사합니다

답변

2

애니메이션의 다른 부분에 의존하는 타이머를 변경하면 객체의 속도가 변경됩니다.

이것은 주관적이지 않습니다. 내 예제에는 동일한 시간대에 속도를 변경할 수있는 객체가 있습니다. 대신 실제로 애니메이션이 재생되는 시간을 변경해야 할 수도 있습니다. 시간이 변경되어야합니다. 이것은 다른 문제를 제기합니다.

이것을 달성하는 한 가지 방법은 실제로 일정한 간격으로 틱하는 타이머와 해당 틱에 반응하는 모델을 만드는 것입니다. 즉, 길이를 조정하면 심장 박동이 영향을 미치지 않으므로 애니메이션을 통해 거리를 조정하면됩니다. 이 방법 Timing Framework 작품이고 나는 Trident 비슷한 디자인을 다음과 생각

enter image description here

public class TestAnimationSpeed { 

    public static void main(String[] args) { 
     new TestAnimationSpeed(); 
    } 

    public TestAnimationSpeed() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new AnimationPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class AnimationPane extends JPanel { 

     private JSlider slider; 
     private BouncyPane bouncyPane; 

     public AnimationPane() { 
      setLayout(new BorderLayout()); 
      bouncyPane = new BouncyPane(); 
      add(bouncyPane, BorderLayout.CENTER); 
      slider = new JSlider(1, 11); 
      slider.setMajorTickSpacing(2); 
      slider.setPaintTicks(true); 
      add(slider, BorderLayout.SOUTH); 
      slider.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        bouncyPane.setVerticalSpeed(slider.getValue()); 
       } 
      }); 
      slider.setValue(4); 
     } 

    } 

    public class BouncyPane extends JPanel { 

     private int dy = 4; 
     private Ellipse2D ball; 

     public BouncyPane() { 
      ball = new Ellipse2D.Float(100, 0, 10, 10); 
      Timer timer = new Timer(1000/60, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        double y = ball.getY(); 
        y += dy; 
        if (y + ball.getHeight() > getHeight()) { 
         y = getHeight() - ball.getHeight(); 
         dy *= -1; 
        } else if (y < 0) { 
         y = 0; 
         dy *= -1; 
        } 
        ball.setFrame(ball.getX(), y, ball.getWidth(), ball.getHeight()); 
        repaint(); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

     public void setVerticalSpeed(int speed) { 
      if (dy < 0 && speed > 0) { 
       dy = -speed; 
      } else { 
       dy = speed; 
      } 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(Color.RED); 
      g2d.fill(ball); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

}