我如何淡出一个图像和另一个(Java)的褪色? [英] How do I fade out one image and fade in another (Java)?

查看:121
本文介绍了我如何淡出一个图像和另一个(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.setHorizo​​ntalAlignment(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆