2013-12-03 4 views
5

Я пытаюсь узнать, как исчезать и выводить изображения на другое изображение или с другого изображения. Итак, если у меня есть 2 изображения и 1 отображается в данный момент, я хочу отобразить другое изображение в фоновом режиме и выцветать первое изображение во втором изображении. ИЛИ, я хочу установить фокус на новом изображении и медленно угасать его по 1-му изображению, а затем перестать отображать первый.Java исчезает и исчезает из изображений

Я не уверен, как:

  1. , чтобы установить фокус, если даже необходимо.

  2. Я могу затухать, если я изменяю альфу на 0 и увеличиваю и рисую только одно изображение, однако я не могу заставить его исчезать либо с любым изменением этого кода. (т. е. комментируя одно изображение для рисования).

Редактировать: Действительно, все, о чем я беспокоюсь, может иметь 2 изображения и сделать изображение, отображаемое в данный момент, медленно исчезает во втором изображении. То, как это достигается, не обязательно должно быть с этим.

Вот пример кода я баловаться с:

import java.awt.AlphaComposite; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class FadeIn extends JPanel implements ActionListener { 

    private Image imagem; 
    private Image image2; 
    private Timer timer; 
    private float alpha = 1f; 

    public FadeIn() { 
     imagem = (new ImageIcon(getClass().getResource(
      "/resources/1stImage.jpg"))).getImage(); 
     image2 = (new ImageIcon(getClass().getResource(
      "/resources/2ndImage.jpg"))).getImage();  
     timer = new Timer(20, this); 
     timer.start(); 
    } 
    // here you define alpha 0f to 1f 

    public FadeIn(float alpha) { 
     imagem = (new ImageIcon(getClass().getResource(
      "/resources/1stImage.jpg"))).getImage(); 
     this.alpha = alpha; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.drawImage(imagem, 0, 0, 400, 300, null); 
     g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 
       alpha)); 
     g2d.drawImage(image2, 0, 0, 400, 300, null); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Fade out"); 
     frame.add(new FadeIn()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(420, 330); 
     // frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     alpha += -0.01f; 
     if (alpha <= 0) { 
      alpha = 0; 
      timer.stop(); 
     } 
     repaint(); 
    } 
} 
+1

что вы имеете в виду под «SETFOCUS»? – MadProgrammer

+0

В основном рисуем одно изображение в фоновом режиме, а другое перед ним. Затем вытрите верхнее изображение с помощью таймера. Вместо белого фона это будет нижнее изображение. Я смог сделать это, если просто заполнить прямоугольник на экране, но я не могу установить изображение в фоновом режиме. – user2079828

ответ

8

В принципе, то, что это делает использовать один и тот же значение альфа, замирание в 0-1, а затем, используя тот же альфа, переходя от 1 -0, что позволяет два изображения, чтобы пересечь замирание друг над другом ...

Fading

магия в основном, происходит в paintComponent, где изображение приходит в использовании значения alpha и исходящего изображения использует 1f - alpha.

Переключение между двумя изображениями, на самом деле тот же самый процесс, ожидают, что inImage обменена на outImage

Выбор времени немного отличается. Вместо прямого перемещения от 0-1 с использованием стандартной дельта (например, 0.01) это использует алгоритм, основанный на времени.

То есть, я использую таймер, который тикает каждые 40 миллисекунд или около того, он затем делает расчет на основе количества времени, таймер работает время и вычисляет значение alpha соответственно ...

Это позволяет вы можете изменить количество времени анимация будет принимать, но и обеспечивает несколько лучший алгоритм, который учитывает пассивный характер Качели движок рендеринга ...

import java.awt.AlphaComposite; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FadeImage { 

    public static void main(String[] args) { 
     new FadeImage(); 
    } 

    public FadeImage() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static class TestPane extends JPanel { 

     public static final long RUNNING_TIME = 2000; 

     private BufferedImage inImage; 
     private BufferedImage outImage; 

     private float alpha = 0f; 
     private long startTime = -1; 

     public TestPane() { 
      try { 
       inImage = ImageIO.read(new File("/path/to/inImage")); 
       outImage = ImageIO.read(new File("/path/to/outImage")); 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 

      final Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (startTime < 0) { 
         startTime = System.currentTimeMillis(); 
        } else { 

         long time = System.currentTimeMillis(); 
         long duration = time - startTime; 
         if (duration >= RUNNING_TIME) { 
          startTime = -1; 
          ((Timer) e.getSource()).stop(); 
          alpha = 0f; 
         } else { 
          alpha = 1f - ((float) duration/(float) RUNNING_TIME); 
         } 
         repaint(); 
        } 
       } 
      }); 
      addMouseListener(new MouseAdapter() { 

       @Override 
       public void mouseClicked(MouseEvent e) { 
        alpha = 0f; 
        BufferedImage tmp = inImage; 
        inImage = outImage; 
        outImage = tmp; 
        timer.start(); 
       } 

      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(
          Math.max(inImage.getWidth(), outImage.getWidth()), 
          Math.max(inImage.getHeight(), outImage.getHeight())); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setComposite(AlphaComposite.SrcOver.derive(alpha)); 
      int x = (getWidth() - inImage.getWidth())/2; 
      int y = (getHeight() - inImage.getHeight())/2; 
      g2d.drawImage(inImage, x, y, this); 

      g2d.setComposite(AlphaComposite.SrcOver.derive(1f - alpha)); 
      x = (getWidth() - outImage.getWidth())/2; 
      y = (getHeight() - outImage.getHeight())/2; 
      g2d.drawImage(outImage, x, y, this); 
      g2d.dispose(); 
     } 

    } 

} 
+0

Хорошо, я понимаю, что вы говорите. Я попытаюсь реализовать это так, как вы указали быстро. – user2079828

+1

Вы можете сделать это, используя прямую дельта, я просто найду время, основанное на времени, дает лучший результат;) – MadProgrammer

+0

Ха-ха, ну, вы более опытные, чем я, поэтому я задержу ваше слово: p Я получил это отлично после Я понял, как загрузить изображение из ресурсов с помощью ImageIO.read. Раньше я никогда не использовал BufferedImage. Будет ли это работать с самолетом старого типа «Изображение»? – user2079828

Смежные вопросы