이론 ...
좋아, 내 첫 번째 제안은에 밖으로 하나의 이미지 페이딩에 집중하는 것입니다. 그렇게하는 방법을 이해할 수 있다면 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

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();
}
}
}
통해 변경된 이미지
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