2012-06-27 6 views
3

기본적으로, 나는 페인트 된 이미지에서 봄 동작을 시뮬레이트하고 싶습니다. 나는 그것이 봄에 고정되는 것처럼 그것을 위아래로 스케일링하는 몇 번의 반복을 통해 실행하게하고 싶다.봄 동작 시뮬레이션

내가이 클래스에 그물 리드에있는 모든 예 - FloatSpring.java

다양한 FloatSpring 클래스 설정에 따라 스프링과 같은 효과를 적용 A 지점에서 B 지점으로 이동하는 데 필요한 계산을 제공해야한다. 문제는 내가 제대로 사용하는 방법을 하나의 명확한 예제를 찾지 못했습니다. zoom 재산권 타이머 사이클 내 3F1F에서 반사하여 최종적으로 3 배 성분 화상 표시 야기한다 본 예에서는

public static void main (String[] args) 
{ 
    // Some image to bounce 
    final ImageIcon icon = 
      new ImageIcon (WebProgressOverlayExample.class.getResource ("icons/ava1.jpg")); 

    // Component to paint image on 
    JComponent spring = new JComponent() 
    { 
     // Zoom value (1f = 100% = normal size) 
     float zoom = 1f; 

     { 
      // Basic spring settings 
      final FloatSpring fs = new FloatSpring (100); 
      fs.setPosition (zoom); 

      // Animation delay 
      final int delay = 1000/24; 

      // Animator 
      new Timer (delay, new ActionListener() 
      { 
       private float elapsed = 0f; 

       public void actionPerformed (ActionEvent e) 
       { 
        // Increasing elapsed time and updating spring 
        elapsed += delay; 
        fs.update (3f, elapsed); 

        // Updating zoom value and component 
        zoom = fs.getPosition(); 
        repaint(); 
       } 
      }).start(); 
     } 

     protected void paintComponent (Graphics g) 
     { 
      super.paintComponent (g); 

      // Scaled image 
      int width = Math.round (icon.getIconWidth() * zoom); 
      int height = Math.round (icon.getIconHeight() * zoom); 
      g.drawImage (icon.getImage(), getWidth()/2 - width/2, 
        getHeight()/2 - height/2, this); 
     } 

     public Dimension getPreferredSize() 
     { 
      return new Dimension (500, 500); 
     } 
    }; 

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

:

난에 FloatSpring을 테스트하기 위해이 작은 예를 만든 줌. 단순한 애니메이션 전환과 같은 것입니다.

FloatSpring 클래스가 잘되어 있어야합니다. 올바르게 사용하는 방법을 모르겠습니다. 정확하게하려면 - 내가 springKdampingK 값으로 지정하고 또한 time 속성 목적이 불분명 ...

정말 거기에 어떤 도움을 주셔서 감사합니다 것입니다해야하는지.

답변

6

여기에 을 사용하면 FloatSpring을 사용합니다.

bungee

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.AbstractAction; 
import javax.swing.Icon; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.Timer; 
import javax.swing.UIManager; 

/** 
* @see http://stackoverflow.com/a/11233735/230513 
*/ 
public class Test { 

    private static Spring spring = new Spring(); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(spring); 
       frame.add(new JButton(new AbstractAction("Start") { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         spring.start(); 
        } 
       }), BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
       spring.start(); 
      } 
     }); 
    } 

    private static class Spring extends JComponent { 

     private static final int SIZE = 500; 
     private static final int DELAY = 1000/20; // ~20Hz 
     private final Icon icon = UIManager.getIcon("OptionPane.informationIcon"); 
     private final FloatSpring fs = new FloatSpring(42); 
     private final int target = 0; 
     private final float delta = 1f/SIZE; 
     private float elapsed = 0f; 
     private Timer timer = new Timer(DELAY, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if ((int) fs.getPosition() < (target + 1)) { 
        timer.stop(); 
        return; 
       } 
       elapsed += delta; 
       fs.update(target, elapsed); 
       repaint(); 
      } 
     }); 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      int x = (getWidth() - icon.getIconWidth())/2; 
      int y = (int) fs.getPosition(); 
      icon.paintIcon(this, g, x, y); 
      int xc = x + icon.getIconWidth()/2; 
      g.drawLine(xc, 0, xc, y); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(SIZE/2, SIZE); 
     } 

     public void start() { 
      timer.stop(); 
      elapsed = 0; 
      fs.setPosition(SIZE - icon.getIconHeight()); 
      fs.setVelocity(0); 
      timer.start(); 
     } 
    } 
} 
+0

덕분에, 내가 찾던 정확히 이잖아! –