Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Java / Transición de imágenes al estilo PowerPoint

Transición de imágenes al estilo PowerPoint

Por jc mouse jueves, julio 9, 2015

¿Qué es una transición?

Una transición es un efecto de movimiento que se da entre una imagen y la siguiente en una presentación.

ppt slide

Transición en java

Para aplicar efectos entre imágenes en aplicaciones java, se debe hacer uso de java2d para manipular los archivos de imagen (color, tamaño, posición,etc) y pintarlos en los contenedores, para repintar la interfaz cada cierto tiempo y crear el efecto de movimiento, se emplea un Timer, un timer permite repetir una tarea cada X tiempo.

Creamos un JPanel en el cual aparte de mostrar las imágenes, implementamos los métodos de animación y el timer.

package com.bolivia.app;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class JPanelPPT extends JPanel{

    public enum CTRL{
        NEXT,
        PREVIOUS
    }
    private CTRL option;    
    private Dimension SIZE_PANEL            =       new Dimension(500,500);
    private List<BufferedImage> imagenList  =       new ArrayList<BufferedImage>();    
    private int index                       =       0;//imagen actual
    private Timer timer;
    private int speed                       =       10;//en milisegundos
    private int x                           =       0;
    private int y                           =       0;
    private int size_cut                    = -10;
    private boolean inTransition            =       false;

    /** Constructor de clase */
    public JPanelPPT()
    {
        super();        
        setSize(SIZE_PANEL);
        setVisible(true); 

        //se carga imagenes en memoria
        try {
            imagenList.add(0, ImageIO.read(this.getClass().getResource("/com/bolivia/app/images/photo1.jpg")));
            imagenList.add(1, ImageIO.read(this.getClass().getResource("/com/bolivia/app/images/photo2.jpg")));
            imagenList.add(2, ImageIO.read(this.getClass().getResource("/com/bolivia/app/images/photo3.jpg")));
            imagenList.add(3, ImageIO.read(this.getClass().getResource("/com/bolivia/app/images/photo4.jpg")));            
        } catch (IOException ex) {
            System.err.println( ex.getMessage() );
        }
    }

    @Override
    public void paintComponent(Graphics g){
        Graphics2D g2 =(Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);                    
        drawTransition(g2);
    }

    /**
 * pinta el efecto de transicion
 */
    public void drawTransition(Graphics2D g2)
    {
        //imagen actual
        g2.drawImage(imagenList.get(index), x, y, getWidth(), getHeight(), null);        
        size_cut +=10;//incrementa
        if( size_cut>0 )
        {        
            //obtiene coordenadas de recorte
            int px = getWidth()/2-size_cut/2;
            int py = getHeight()/2-size_cut/2;
            if( px >= 0 )
            {                
                int sindex=0;
                if(option == CTRL.NEXT)                                    
                    sindex = ((index+1) < imagenList.size())?index+1:0;                    
                else if(option == CTRL.PREVIOUS)
                    sindex = ((index-1) >= 0)?index-1:imagenList.size()-1;                                    
                //extrae recorte de imagen siguiente/anterior y dibuja
                BufferedImage recorte = imagenList.get(sindex).getSubimage(px,py,size_cut,size_cut);                        
                g2.drawImage(recorte, px, py, recorte.getWidth(), recorte.getHeight(), null);                       
                g2.dispose();
            }else{
                timer.stop();
                inTransition=false;
                g2.dispose();
                if(option == CTRL.NEXT)
                {
                   index+=1;
                   if(index>=imagenList.size()) index=0;                    
                }                
                if(option == CTRL.PREVIOUS)
                {
                    index-=1;
                    if(index<0) index=imagenList.size()-1;
                }
                repaint();
                size_cut=-10;//reinicia 
            }
        }
    }

    /**
 * @param CTRL option
 */
    public void play(CTRL option)
    {   
        this.option = option;    
        inTransition = !inTransition;
        ActionListener animation = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                repaint();//refresca panel
            }
        };        

        if(inTransition)
        {
            if(timer!=null)timer.stop();
            timer = new Timer(speed,animation);
            timer.start();       
        }
        //else timer.stop();

    }
}//JPanelPPT:end

Esta clase que tiene un tamaño fijo de 500×500 pixeles se añade a la interfaz de la siguiente manera:

//nueva instancia
JPanelPPT ppt= new JPanelPPT();
//se añade a la interfaz
add(ppt);
//para avanzar
ppt.play(JPanelPPT.CTRL.NEXT);
//para retroceder
ppt.play(JPanelPPT.CTRL.PREVIOUS);

El efecto que logramos con este código es el de RECUADRO SALIENTE en Power Point

Descargar ejemplo en este enlace pobre

enjoy!!!

Tags

Artículos similares

Animación de JProgressBar con hilos

Si nuestra aplicación tiene que llevar a cabo un cierto trabajo que no sabemos cuanto durará y que a la vez consume much[...]

Introducción a la edición de imágenes con ImageMagick

ImageMagick es un software de código abierto multiplataforma que contiene una serie de herramientas para leer, mostrar,[...]

Generador de código para Netbeans

El IDE Netbeans al igual que Eclipse :), nos permite personalizar el espacio de trabajo y añadir funcionalidades que nos[...]

Formulario de login personalizado

Hola, en este oportunidad dejo a disposición un formulario de logueo que se me ocurrió de repente creo inspirado en las[...]

Mapas en HTML5 – Uniendo todo – Parte 6

Última parte del tutorial «Mapas interactivos HTML5», vamos uniendo todo todo el código. En la parte 5 de este tutorial,[...]

Elimina el fondo de tus fotografías en 5 segundos

Si te gusta realizar tus propios memes o foto montajes pero tienes poca o nula experiencia en editores gráficos como Pho[...]