2017-12-02 28 views
0

제 질문은 어떻게하면 첫 번째 이미지가 사라지고 그 다음에는 이미지가 사라져서 세 번째 이미지가 사라지는 것입니다. 나는 여기 저기에 그러나 아무것도 작동하려고 노력하지 않았다. 모든 것이 즉시 나옵니다. 누군가 내가 어떤 부분을 바꾸어야한다고 말할 수 있습니까? 그래서 귀하의 요구 사항에 따라JPanel에서 3 가지 이미지를 페이드 인하거나 페이드 아웃하는 방법은 무엇입니까?

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 FadeOutImage2 extends JPanel implements ActionListener{ 

    Image myImage = new ImageIcon("C:\\Users\\NUR\\Pictures\\FLOWER1.jpg").getImage(); 
    Image myImage2 = new ImageIcon("C:\\Users\\NUR\\Pictures\\FLOWER2.jpg").getImage(); 
    Image myImage3 = new ImageIcon("C:\\Users\\NUR\\Pictures\\FLOWER3.jpg").getImage(); 

    Timer timer = new Timer (50, this); //setting time to fade 
    private float alpha = 1f; //alpha value on channel 

    public FadeOutImage2(){ 
    timer.start(); 
    } 

    public void paint(Graphics g){ 
    super.paint(g); 

    Graphics2D g2d = (Graphics2D)g; 
    Graphics2D g2d2 = (Graphics2D)g; 
    Graphics2D g2d3 = (Graphics2D)g; 


g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha)); 
g2d2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha)); 
g2d3.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha)); 

g2d.drawImage(myImage, 10,10, null); //coordinate 
g2d2.drawImage(myImage2, 10,10, null); 
g2d3.drawImage(myImage3, 10,10, null); 
    } 

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

     repaint(); 
    } 

public static void main(String[] args){ 
    JFrame frame = new JFrame("Fade Out"); 
    frame.add(new FadeOutImage2()); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(1500,1500); 
    frame.setVisible(true); 
} 
} 
+0

통해 변경된 이미지 List를 생성하기 어렵지 않을 것이다 당신은 [this] (https://stackoverflow.com/questions/20346661/java-fade-in-and-out-of-images/20347600#20347600)와 [this] (https://stackoverflow.com)와 같은 것을 의미합니다./questions/34119221/java-fade-in-and-out-two-jpanels-at-the-same-time/34123681 # 34123681) – MadProgrammer

답변

1

이론 ...

좋아, 내 첫 번째 제안은에 밖으로 하나의 이미지 페이딩에 집중하는 것입니다. 그렇게하는 방법을 이해할 수 있다면 3 개의 이미지를 페이드 아웃 (하나씩 차례대로)하는 것이 훨씬 간단합니다.

애니메이션은 시간이 지남에 따라 변화하는 환상입니다. 따라서 일정 기간 동안 alpha의 상태를 변경하려면 먼저 다른 방법이 필요합니다. Swing은 단일 스레드이며 스레드로부터 안전하지 않기 때문에 Swing은 하나의 기본 선택 인 Swing Timer을 남깁니다.

이벤트 디스패치 스레드의 컨텍스트 내에서 트리거되는 일정한 간격으로 업데이트를 생성하므로 Swing과 함께 사용하고 내부에서 UI를 업데이트하는 것이 안전합니다. (당신이 당신의 손이 닿지 않는 당신의 target 때까지 alpha에 고정 delta을 적용하고 반복 곳, 즉) 때문에 하드웨어의 차이 (및 OS의)의

, 난 고정 금리 페이드를 피할 것. 이 접근법은 다른 시스템에서 바람직하지 않은 결과를 생성 할 수 있습니다.

내 경험에 따르면 시간 기반 솔루션은 일반적으로보다 일관된 결과를 산출합니다. 시간 기반 접근 방식은 애니메이션이 지정된 기간 동안 실행되고 각 틱이 Timer 일 때 진행률을 계산하고이를 주에 적용합니다 (0-1에서 이동하여 이미지를 페이드 아웃해야 함을 알 수 있음). 그것이 진행에 따라 상태)

의베이스 구현 ... 모든 소리가 실제로 찾아 낸다

을 계산하기 쉽지만, 우리가 실제로 적용 어떻게 있도록. 솔루션이 항상 단순하지는 않으므로 작업을 수행하기위한 전용 클래스를 만드는 데 중점을 둡니다.

public class FadePane extends JPanel { 

    private BufferedImage source; 
    private Timer timer; 

    private float alpha = 1.0f; 

    private int duration = 2000; // 2 seconds 
    private Long startTime; 

    private boolean fadeOut = false; 

    private FadeListener fadeListener; 

    public FadePane(BufferedImage source) { 
     this.source = source; 
     timer = new Timer(5, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (startTime == null) { 
        startTime = System.currentTimeMillis(); 
        fadeStarted(); 
       } 
       long diff = System.currentTimeMillis() - startTime; 
       alpha = (float)diff/(float)duration; 
       if (alpha > 1.0) { 
        timer.stop(); 
        alpha = 1.0f; 
        fadeCompleted(); 
       } 
       if (fadeOut) { 
        alpha = 1.0f - alpha; 
       } 
       repaint(); 
      } 
     }); 
    } 

    public void setFadeListener(FadeListener listener) { 
     fadeListener = listener; 
    } 

    public boolean isFadeOut() { 
     return fadeOut; 
    } 

    protected void fadeStarted() { 
     if (fadeListener != null) { 
      fadeListener.fadeStarted(this); 
     } 
    } 

    protected void fadeCompleted() { 
     if (fadeListener != null) { 
      fadeListener.fadeCompleted(this); 
     } 
    } 

    public void setSource(BufferedImage img) { 
     source = img; 
    } 

    public void reset() { 
     timer.stop(); 
     alpha = 0; 
     startTime = null; 
    } 

    public void fadeIn() { 
     reset(); 
     fadeOut = false; 
     timer.start(); 
    } 

    public void fadeOut() { 
     reset(); 
     fadeOut = true; 
     timer.start(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return source == null ? new Dimension(200, 200) : new Dimension(source.getWidth(), source.getHeight()); 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); 
     int x = (getWidth() - source.getWidth())/2; 
     int y = (getHeight() - source.getHeight())/2; 
     g2d.drawImage(source, x, y, this); 
     g2d.dispose(); 
    } 

} 

FadePane 2 초 동안 또는 밖으로 사라질 것이다, 당신이 전화를하는 방법에 따라 source 이미지를 걸립니다.

setSource 방법을 통해 source 이미지를 변경하고 이후에 원하는 결과에 따라 새 이미지를 페이드 인 또는 페이드 아웃하여 다시 사용할 수 있습니다.

이것은 UI의 상태를 변경하는데 사용될 수

public interface FadeListener { 
    public void fadeStarted(FadePane pane); 
    public void fadeCompleted(FadePane pane); 
} 

또한 페이딩 동작이 시작되고 완료 될 때 통지 관찰자를 제공 FadePane는 ...로 (기능을 활성화/비활성화) 잘 때 이미지를 전환

실행 가능한 예 ...

간단한 예는 안팎으로 동일한 화상을 페이드하도록 사용자를 허용하지만 FadeListener

Fade

import java.awt.AlphaComposite; 
import java.awt.BorderLayout; 
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.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

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

        BufferedImage source = ImageIO.read(...); 
        FadePane fadePane = new FadePane(source); 
        JButton btn = new JButton("Fade"); 
        btn.addActionListener(new ActionListener() { 
         private boolean fadeOut = true; 
         @Override 
         public void actionPerformed(ActionEvent e) { 
          if (fadeOut) { 
           fadePane.fadeOut(); 
          } else { 
           fadePane.fadeIn(); 
          } 
          fadeOut = !fadeOut; 
         } 
        }); 

        fadePane.setFadeListener(new FadeListener() { 
         @Override 
         public void fadeStarted(FadePane pane) { 
          btn.setEnabled(false); 
         } 

         @Override 
         public void fadeCompleted(FadePane pane) { 
          // Set next image and start the 
          // fade process again 
          btn.setEnabled(true); 
         } 
        }); 

        JFrame frame = new JFrame("Testing"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.add(fadePane); 
        frame.add(btn, BorderLayout.SOUTH); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public interface FadeListener { 
     public void fadeStarted(FadePane pane); 
     public void fadeCompleted(FadePane pane); 
    } 

    public class FadePane extends JPanel { 

     private BufferedImage source; 
     private Timer timer; 

     private float alpha = 1.0f; 

     private int duration = 2000; // 2 seconds 
     private Long startTime; 

     private boolean fadeOut = false; 

     private FadeListener fadeListener; 

     public FadePane(BufferedImage source) { 
      this.source = source; 
      timer = new Timer(5, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (startTime == null) { 
         startTime = System.currentTimeMillis(); 
         fadeStarted(); 
        } 
        long diff = System.currentTimeMillis() - startTime; 
        alpha = (float)diff/(float)duration; 
        if (alpha > 1.0) { 
         timer.stop(); 
         alpha = 1.0f; 
         fadeCompleted(); 
        } 
        if (fadeOut) { 
         alpha = 1.0f - alpha; 
        } 
        repaint(); 
       } 
      }); 
     } 

     public void setFadeListener(FadeListener listener) { 
      fadeListener = listener; 
     } 

     protected void fadeStarted() { 
      if (fadeListener != null) { 
       fadeListener.fadeStarted(this); 
      } 
     } 

     protected void fadeCompleted() { 
      if (fadeListener != null) { 
       fadeListener.fadeCompleted(this); 
      } 
     } 

     public void setSource(BufferedImage img) { 
      source = img; 
     } 

     public void reset() { 
      timer.stop(); 
      alpha = 0; 
      startTime = null; 
     } 

     public boolean isFadeOut() { 
      return fadeOut; 
     } 

     public void fadeIn() { 
      reset(); 
      fadeOut = false; 
      timer.start(); 
     } 

     public void fadeOut() { 
      reset(); 
      fadeOut = true; 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return source == null ? new Dimension(200, 200) : new Dimension(source.getWidth(), source.getHeight()); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); 
      int x = (getWidth() - source.getWidth())/2; 
      int y = (getHeight() - source.getHeight())/2; 
      g2d.drawImage(source, x, y, this); 
      g2d.dispose(); 
     } 

    } 

}