我如何淡出一个图像和另一个(Java)的褪色? [英] How do I fade out one image and fade in another (Java)?
本文介绍了我如何淡出一个图像和另一个(Java)的褪色?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想使它所以,当一个图像淡出,另外一个正在消失。我有两个 BufferedImages
和我使用AWT。
编辑:
包com.cgp.buildtown;进口java.awt.BorderLayout中;
进口java.awt.Color中;
进口java.awt.Cursor中;
进口java.awt.Font中;
进口java.awt.FontFormatException;
进口java.awt.Graphics;
进口java.awt.GraphicsEnvironment;
进口java.awt.event.MouseEvent中;
进口java.awt.event.MouseListener;
进口java.awt.event.MouseMotionListener;
进口java.awt.image.BufferedImage中;
进口的java.io.File;
进口java.io.IOException异常;进口javax.imageio.ImageIO中;
进口javax.swing.JPanel中;
进口javax.swing.JTextField中;
进口javax.swing.border.EmptyBorder中;公共类介绍继承JPanel实现Runnable,MouseListener的,{的MouseMotionListener
私有静态最后的serialVersionUID长1L =;
私人螺纹螺纹;
私人的BufferedImage BG,BGSEL,BG2,bg2sel;
私人的JTextField TF =新的JTextField();
私人字体字库;
私人诠释mousex,像老鼠;
私人布尔buttonClicked = FALSE; 公共简介(){
超();
loadImages();
addMouseListener将(本);
addMouseMotionListener(本);
的setLayout(新的BorderLayout());
setBorder(新EmptyBorder(100,110,150,110));
tf.setHorizontalAlignment(JTextField.CENTER);
tf.setFont(loadFont(50F));
tf.setBackground(新颜色(255,255,205));
tf.setBorder(NULL);
tf.setForeground(Color.BLACK);
加(TF,BorderLayout.SOUTH);
} 私人字体loadFont(浮动六){
尝试{
字体= Font.createFont(Font.TRUETYPE_FONT,新的文件(RES / komikatext.ttf));
GraphicsEnvironment中GE = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(字体);
}赶上(FontFormatException此| IOException异常五){
e.printStackTrace();
}
返回font.deriveFont(F);
} 私人无效loadImages(){
尝试{
BG = ImageIO.read(新文件(RES / introbg1.png));
BGSEL = ImageIO.read(新文件(RES / introbg1selected.png));
BG2 = ImageIO.read(新文件(RES / introbg2.png));
bg2sel = ImageIO.read(新文件(RES / introbg2selected.png));
}赶上(IOException异常五){
e.printStackTrace();
}
} 公共无效信息addNotify(){
super.addNotify();
线程=新主题(本);
thread.start();
} 公共无效的run(){
而(真){
重绘();
如果(!buttonClicked){
如果(mousex> = 350&放大器;&放大器; mousex&下; = 450&放大器;&放大器;像老鼠> = 450&放大器;&放大器;像老鼠&下; = 490&放大器;&放大器; tf.getText()长度()方式> 0 )
的setCursor(Cursor.get predefinedCursor(Cursor.HAND_CURSOR));
其他
的setCursor(Cursor.getDefaultCursor());
}其他{
如果(mousex> = 300&放大器;&放大器; mousex&下; = 500&放大器;&放大器;像老鼠> = 450&放大器;&放大器;像老鼠&下; = 490&放大器;&放大器; tf.getText()长度()方式> 0 )
的setCursor(Cursor.get predefinedCursor(Cursor.HAND_CURSOR));
其他
的setCursor(Cursor.getDefaultCursor());
}
尝试{
视频下载(40);
}赶上(InterruptedException的E){
e.printStackTrace();
}
}
} 公共无效的paintComponent(图形G){
super.paintComponent方法(G); 如果(!buttonClicked){
g.drawImage(BG,0,0,NULL);
如果(mousex> = 350&放大器;&放大器; mousex&下; = 450&放大器;&放大器;像老鼠> = 450&放大器;&放大器;像老鼠&下; = 490&放大器;&放大器; tf.getText()长度()方式> 0 )
g.drawImage(BGSEL,350,450,NULL);
}否则如果(buttonClicked){
g.drawImage(BG2,0,0,NULL);
如果(mousex> = 300&放大器;&放大器; mousex&下; = 500&放大器;&放大器;像老鼠> = 450&放大器;&放大器;像老鼠&下; = 490&放大器;&放大器; tf.getText()长度()方式> 0 )
g.drawImage(bg2sel,300,450,空);
}
} @燮pressWarnings(德precation)
公共无效的mouseClicked(的MouseEvent E){
如果(mousex> = 350&放大器;&放大器; mousex&下; = 450&放大器;&放大器;像老鼠> = 450&放大器;&放大器;像老鼠&下; = 490&放大器;&放大器; tf.getText()长度()方式> 0 &功放;&安培;!buttonClicked){
tf.setText(tf.getText()+的城);
buttonClicked = TRUE;
}否则如果(mousex> = 350安培;&安培; mousex< = 450安培;&安培;像老鼠> = 450安培;&安培;像老鼠< = 490安培;&安培; tf.getText()长()&GT。 0安培;&放大器; buttonClicked){
BuildTown.replace();
使用Thread.stop();
}
} 公共无效的mouseMoved(的MouseEvent E){
mousex = e.getX();
像老鼠= e.getY();
} 公共无效鼠标pressed(的MouseEvent E){ } 公共无效的mouseReleased(的MouseEvent E){ } 公共无效的mouseEntered(的MouseEvent E){ } 公共无效的mouseExited(的MouseEvent E){ } 公共无效的mouseDragged(的MouseEvent E){ }
}
解决方案
您可以使用三叉戟一>插值你在你的类中定义的属性。然后在画您可以在的AlphaComposite <使用这个属性如α / A>。 这里你可以找到的AlphaComposite一些例子。
编辑:
可能是这可以帮助你:
//定义属性动画
浮动不透明度;//定义动画时间表
时间轴时间轴=新的时间线(本);
timeline.addPropertyToInterpolate(不透明度,1.0F,0.0);
timeline.play();//内画
...
Graphics2D的G2D =(Graphics2D的)g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(this.opacity));
g2d.drawImage(IMG1 ...);g2d.setComposite(AlphaComposite.SrcOver.derive(1.0 - this.opacity));
g2d.drawImage(IMG1 ...);g2d.dispose();
...
I want to make it so that while one image is fading out, another is fading in. I have two BufferedImages
and I'm using AWT.
Edit:
package com.cgp.buildtown;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class Intro extends JPanel implements Runnable, MouseListener, MouseMotionListener {
private static final long serialVersionUID = 1L;
private Thread thread;
private BufferedImage bg, bgsel, bg2, bg2sel;
private JTextField tf = new JTextField();
private Font font;
private int mousex, mousey;
private boolean buttonClicked = false;
public Intro() {
super();
loadImages();
addMouseListener(this);
addMouseMotionListener(this);
setLayout(new BorderLayout());
setBorder(new EmptyBorder(100, 110, 150, 110));
tf.setHorizontalAlignment(JTextField.CENTER);
tf.setFont(loadFont(50f));
tf.setBackground(new Color(255, 255, 205));
tf.setBorder(null);
tf.setForeground(Color.BLACK);
add(tf, BorderLayout.SOUTH);
}
private Font loadFont(Float f) {
try {
font = Font.createFont(Font.TRUETYPE_FONT, new File("res/komikatext.ttf"));
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(font);
} catch (FontFormatException | IOException e) {
e.printStackTrace();
}
return font.deriveFont(f);
}
private void loadImages() {
try {
bg = ImageIO.read(new File("res/introbg1.png"));
bgsel = ImageIO.read(new File("res/introbg1selected.png"));
bg2 = ImageIO.read(new File("res/introbg2.png"));
bg2sel = ImageIO.read(new File("res/introbg2selected.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void addNotify() {
super.addNotify();
thread = new Thread(this);
thread.start();
}
public void run() {
while (true) {
repaint();
if (!buttonClicked) {
if (mousex >= 350 && mousex <= 450 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0)
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
else
setCursor(Cursor.getDefaultCursor());
} else {
if (mousex >= 300 && mousex <= 500 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0)
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
else
setCursor(Cursor.getDefaultCursor());
}
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (!buttonClicked) {
g.drawImage(bg, 0, 0, null);
if (mousex >= 350 && mousex <= 450 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0)
g.drawImage(bgsel, 350, 450, null);
} else if (buttonClicked) {
g.drawImage(bg2, 0, 0, null);
if (mousex >= 300 && mousex <= 500 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0)
g.drawImage(bg2sel, 300, 450, null);
}
}
@SuppressWarnings("deprecation")
public void mouseClicked(MouseEvent e) {
if (mousex >= 350 && mousex <= 450 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0 && !buttonClicked) {
tf.setText(tf.getText() + "'s Town");
buttonClicked = true;
} else if (mousex >= 350 && mousex <= 450 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0 && buttonClicked) {
BuildTown.replace();
thread.stop();
}
}
public void mouseMoved(MouseEvent e) {
mousex = e.getX();
mousey = e.getY();
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
}
}
解决方案
You can use Trident to interpolate a property you define in your class. Then during painting you can use this property as alpha in AlphaComposite. Here you can find some examples for AlphaComposite.
EDIT: May be this can help you:
//define a property to animate
float opacity;
//define timeline for animation
Timeline timeline = new Timeline(this);
timeline.addPropertyToInterpolate("opacity", 1.0f, 0.0f);
timeline.play();
//inside painting
...
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(this.opacity));
g2d.drawImage(img1...);
g2d.setComposite(AlphaComposite.SrcOver.derive(1.0 - this.opacity));
g2d.drawImage(img1...);
g2d.dispose();
...
这篇关于我如何淡出一个图像和另一个(Java)的褪色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文