proyectos ejemplos java swing timer paintcomponent imageicon

java - ejemplos - django



SimulaciĆ³n de comportamiento de primavera (1)

Aquí hay una herramienta de trabajo que usa FloatSpring .

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(); } } }

Básicamente, quiero simular el comportamiento de primavera en la imagen pintada. Quiero hacer que funcione a través de algunas iteraciones escalando hacia arriba y hacia abajo (como si estuviera fijo en un resorte).

Todos los ejemplos que encontré en la red conducen a esta clase: FloatSpring.java

Debería proporcionar los cálculos necesarios para mover el punto A al punto B aplicando un efecto de resorte que depende de varias configuraciones de clase de FloatSpring. El problema es que no encontré un solo ejemplo claro de cómo usarlo correctamente.

Hice este pequeño ejemplo para probar FloatSpring en:

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 ); }

En este ejemplo, la propiedad de zoom debería rebotar de 1f a 3f dentro del ciclo de temporizador y finalmente conducir la imagen de componente mostrada al zoom de 3X. Algo así como una simple transición animada.

La clase FloatSpring debería estar bien; simplemente no entiendo cómo usarla correctamente. Para ser exactos, ¿qué debo especificar como valores de springK y dampingK y también el propósito de la propiedad de time no está claro ...

Realmente agradecería cualquier ayuda allí.