
ImagenFBR
Clase visual que permite la representaci贸n de una imagen con una animaci贸n de Fancy Border Radius (FBR).
Para ver la idea b谩sica del componente puede ir a este enlace
Esta clase hereda de JComponent.
Este es un componente personalizado cuya idea original se encuentra en este repositorio de DJ Raven.
Preview de Componente en la Prueba Visual:
脥ndice de Contenido
Constructores
Constructor con Imagen, Inicio de FBR y Fin de FBR
- Arquetipo: ImagenFBR(Icon, String, String)
- Par谩metros: Iconimagen a renderizar,Stringinicio de FBR,Stringfin de FBR
- Descripci贸n: Permite construir el componente visual ImagenFBRcon la imagen y los valores de inicio y fin.
- Particularidades: Para construir el FBR con los - valores de start y end, puede visitar el siguiente sitio
 
- Ejemplo de uso: - ImagenFBR i = new ImagenFBR(new ImageIcon(PruebaVisual.class.getResource("/imagenes_prueba/avatar2.jpg")), "40% 60% 60% 40% / 60% 30% 70% 40%", "40% 60%");
Atributos de inter茅s
Imagen
- Arquetipo: Icon imagen
- Descripci贸n: Iconque determina la imagen del fbr a renderizar.
- M茅todos Relacionados: Getter de Imagen y Setter de Imagen
M茅todos de inter茅s
Getter de Imagen
- Arquetipo: getImagen()
- Descripci贸n: Permite obtener el Iconde la imagen usada para renderizar el componente.
- Atributos Relacionados: Imagen
- Ejemplo de uso: - ImagenFBR i = new ImagenFBR(...); Icon ico = i.getAvatar(); // ico = Icon
Setter de Imagen
- Arquetipo: setImagen(Icon)
- Par谩metros: Iconimagen a renderizar.
- Descripci贸n: Permite modificar la imagen del fbr renderizada.
- Particularidades: Se recomienda que las im谩genes sean con formato .jpg(versi贸n ligera) o.png(transparencia). No se guardan los avatares que seannull, sino que se mantiene el valor anteriormente guardado.
- Atributos Relacionados: Imagen
- Ejemplo de uso: - AvatarCircular avatar = new AvatarCircular(); avatar.setAvatar(ClaseBase.class.getResource("/img/avatar.png"));
Ejemplo de Uso
public class Prueba extends JFrame {
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private AvatarCircular avatarCircular;
	public Prueba() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		avatarCircular = new ImagenFBR(new ImageIcon(PruebaVisual.class.getResource("/imagenes_prueba/avatar2.jpg")), "40% 60% 60% 40% / 60% 30% 70% 40%", "40% 60%");
		avatarCircular.setBounds(151, 65, 136, 115);
		contentPane.add(avatarCircular);
	}
}
C贸digo Fuente
public class ImagenFBR extends JComponent{
	private static final long serialVersionUID = 1L;
	private Animator animator;
	private Animator animatorRotate;
	private float animate;
	private float rotate;
	private FancyAnimation fancyAnimation;
	
	private Icon imagen;
	public ImagenFBR(Icon imagen, String fbrStart, String fbrEnd) {
		this.imagen = imagen;
		fancyAnimation = new FancyAnimation(fbrStart, fbrEnd);
		animator = new Animator(5000, new TimingTargetAdapter() {
			@Override
			public void timingEvent(float fraction) {
				animate = fraction;
				repaint();
			}
		});
		animator.setResolution(5);
		animator.setRepeatCount(-1);
		animator.setRepeatBehavior(Animator.RepeatBehavior.REVERSE);
		animatorRotate = new Animator(10000, new TimingTargetAdapter() {
			@Override
			public void timingEvent(float fraction) {
				rotate = fraction;
			}
		});
		animatorRotate.setResolution(5);
		animatorRotate.setRepeatCount(-1);
		animatorRotate.setRepeatBehavior(Animator.RepeatBehavior.LOOP);
	}
	
	public Icon getImagen() {
		return imagen;
	}
	public void setImagen(Icon image) {
		this.imagen = image;
		repaint();
	}
	public void start() {
		if (!animator.isRunning()) {
			animator.start();
			animatorRotate.start();
		}
	}
	public void stop() {
		animator.stop();
		animatorRotate.stop();
	}
	@Override
	protected void paintComponent(Graphics grphcs) {
		double width = getWidth() * 0.8f;
		double height = getHeight() * 0.8f;
		double x = (getWidth() - width) / 2;
		double y = (getHeight() - height) / 2;
		BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = img.createGraphics();
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		FancyBorderRadius border = new FancyBorderRadius(width, height, fancyAnimation.getAnimate(animate));
		AffineTransform tran = g2.getTransform();
		g2.translate(x, y);
		g2.rotate(Math.toRadians(360 * rotate), width / 2, height / 2);
		g2.fill(border.getShape());
		if (imagen != null) {
			g2.setTransform(tran);
			g2.setComposite(AlphaComposite.SrcIn);
			Rectangle rec = getAutoSize(imagen);
			g2.drawImage(toImage(imagen), rec.x, rec.y, rec.width, rec.height, null);
		}
		g2.dispose();
		grphcs.drawImage(img, 0, 0, null);
		super.paintComponent(grphcs);
	}
	private Rectangle getAutoSize(Icon image) {
		int w = getWidth();
		int h = getHeight();
		int iw = image.getIconWidth();
		int ih = image.getIconHeight();
		double xScale = (double) w / iw;
		double yScale = (double) h / ih;
		double scale = Math.max(xScale, yScale);
		int width = (int) (scale * iw);
		int height = (int) (scale * ih);
		if (width < 1) {
			width = 1;
		}
		if (height < 1) {
			height = 1;
		}
		int x = (w - width) / 2;
		int y = (h - height) / 2;
		return new Rectangle(new Point(x, y), new Dimension(width, height));
	}
	private Image toImage(Icon icon) {
		return ((ImageIcon) icon).getImage();
	}
}
Clases utilizadas (Importaciones)
import java.awt.AlphaComposite;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import org.jdesktop.animation.timing.Animator;
import org.jdesktop.animation.timing.TimingTargetAdapter;
import raven.fbr.FancyAnimation;
import raven.fbr.FancyBorderRadius;
