a

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 enlaceopen in new window

Esta clase hereda de JComponent.

Este es un componente personalizado cuya idea original se encuentra en este repositorioopen in new window de DJ Ravenopen in new window.

Preview de Componente en la Prueba Visual:a

脥ndice de Contenido

Constructores

Constructor con Imagen, Inicio de FBR y Fin de FBR

  • Arquetipo: ImagenFBR(Icon, String, String)
  • Par谩metros: Icon imagen a renderizar, String inicio de FBR, String fin de FBR
  • Descripci贸n: Permite construir el componente visual ImagenFBR con la imagen y los valores de inicio y fin.
  • Particularidades: Para construir el FBR con los
  • 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

M茅todos de inter茅s

Getter de Imagen

  • Arquetipo: getImagen()
  • Descripci贸n: Permite obtener el Icon de 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: Icon imagen 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 sean null, 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;