package trident.swing; import java.awt.*; import java.awt.geom.Ellipse2D; import javax.swing.*; import org.pushingpixels.trident.Timeline; import org.pushingpixels.trident.TridentConfig; import org.pushingpixels.trident.Timeline.RepeatBehavior; import org.pushingpixels.trident.ease.Sine; import org.pushingpixels.trident.interpolator.PropertyInterpolator; import org.pushingpixels.trident.swing.SwingRepaintTimeline; public class CustomPropertyInterpolatorSource extends JFrame { private Ellipse2D ellipse; private static class Ellipse2DPropertyInterpolator implements PropertyInterpolator<Ellipse2D> { public Class getBasePropertyClass() { return Ellipse2D.class; } @Override public Ellipse2D interpolate(Ellipse2D from, Ellipse2D to, float timelinePosition) { double x = from.getX() + timelinePosition * (to.getX() - from.getX()); double y = from.getY() + timelinePosition * (to.getY() - from.getY()); double w = from.getWidth() + timelinePosition * (to.getWidth() - from.getWidth()); double h = from.getHeight() + timelinePosition * (to.getHeight() - from.getHeight()); return new Ellipse2D.Double(x, y, w, h); } } public CustomPropertyInterpolatorSource() { TridentConfig.getInstance().addPropertyInterpolator( new Ellipse2DPropertyInterpolator()); Ellipse2D from = new Ellipse2D.Double(10, 10, 100, 50); Ellipse2D to = new Ellipse2D.Double(40, 40, 200, 120); this.ellipse = (Ellipse2D) from.clone(); JPanel ellipsePanel = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.red); g2d.fill(ellipse); g2d.dispose(); } }; ellipsePanel.setBackground(Color.black); Timeline ellipseTimeline = new Timeline(this); ellipseTimeline.addPropertyToInterpolate("ellipse", from, to); ellipseTimeline.setEase(new Sine()); ellipseTimeline.setDuration(2000); ellipseTimeline.playLoop(RepeatBehavior.REVERSE); new SwingRepaintTimeline(ellipsePanel).playLoop(RepeatBehavior.LOOP); this.add(ellipsePanel); this.setSize(400, 300); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void setEllipse(Ellipse2D ellipse) { this.ellipse = ellipse; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new CustomPropertyInterpolatorSource().setVisible(true); } }); } }