Java 如何在swing中淡入图像?

Java 如何在swing中淡入图像?,java,swing,animation,fade,Java,Swing,Animation,Fade,我有一个从JPanel继承的类,上面有一个图像,我想设置一个小动画来显示面板/图像,然后在事件触发时淡出 我大概设置了一个线程并启动了动画,但我实际上如何进行淡入淡出呢 您可以自己执行线程处理,但是使用库来处理它可能更容易。如果在类上创建一个名为(比如,setOpacity)的setter,可以让trident在特定的时间段内将“opacity”字段从1.0插值到0.0(下面介绍如何使用trident) 在绘制图像时,可以使用合成的alpha参数的更新“opacity”值,使用AlphaComp

我有一个从JPanel继承的类,上面有一个图像,我想设置一个小动画来显示面板/图像,然后在事件触发时淡出


我大概设置了一个线程并启动了动画,但我实际上如何进行淡入淡出呢

您可以自己执行线程处理,但是使用库来处理它可能更容易。如果在类上创建一个名为(比如,
setOpacity
)的setter,可以让trident在特定的时间段内将“opacity”字段从1.0插值到0.0(下面介绍如何使用trident)


在绘制图像时,可以使用合成的alpha参数的更新“opacity”值,使用
AlphaComposite
进行透明度处理。有一个Sun教程,其中包括一个。

您可以自己执行线程,但是使用库来处理它可能更容易。如果在类上创建一个名为(比如,
setOpacity
)的setter,可以让trident在特定的时间段内将“opacity”字段从1.0插值到0.0(下面介绍如何使用trident)


在绘制图像时,可以使用合成的alpha参数的更新“opacity”值,使用
AlphaComposite
进行透明度处理。有一个Sun教程,其中包括一个。

有一些关于图像透明度的有用信息

您的方法如下:

  • 定义一个Swing,每N毫秒在事件分派线程上触发一个
    ActionEvent
  • ActionListener
    添加到
    计时器中,该计时器应在包含
    图像的
    组件上调用
    repaint()
  • 覆盖
    组件
    绘制组件(图形)
    方法以执行以下操作:
    • Graphics
      对象强制转换为
      Graphics2D
    • 使用
      setComposite
      Graphics2D
      上设置一个
      AlphaComposite
      。这将控制透明度的级别
    • 画一张图

对于淡出动画的每次迭代,您将更改AlphaComposite的值,以使图像更透明。

有一些有用的信息描述图像透明度

您的方法如下:

  • 定义一个Swing,每N毫秒在事件分派线程上触发一个
    ActionEvent
  • ActionListener
    添加到
    计时器中,该计时器应在包含
    图像的
    组件上调用
    repaint()
  • 覆盖
    组件
    绘制组件(图形)
    方法以执行以下操作:
    • Graphics
      对象强制转换为
      Graphics2D
    • 使用
      setComposite
      Graphics2D
      上设置一个
      AlphaComposite
      。这将控制透明度的级别
    • 画一张图

对于淡出动画的每次迭代,您都会更改alpha Composite的值,以使图像更透明。

以下是使用alpha透明的示例。您可以使用查看使用不同颜色、模式和字母的结果

import java.awt.*;
导入java.awt.event.*;
导入java.awt.event.ActionListener;
导入javax.swing.*;
公共类AlphaTest扩展JPanel实现ActionListener{
私有静态最终字体字体=新字体(“衬线”,Font.PLAIN,32);
private static final String=“Mothra alert!”;
专用静态最终浮动增量=-0.1f;
专用静态最终计时器=新计时器(100,空);
专用浮点数α=1f;
字母测试(){
此.setPreferredSize(新维度(256,96));
此.set不透明(true);
这个.背景(颜色.黑色);
定时器。设置初始延迟(1000);
timer.addActionListener(this);
timer.start();
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
g2d.setFont(字体);
int xx=this.getWidth();
int yy=this.getHeight();
int w2=g.getFontMetrics().stringWidth(STRING)/2;
int h2=g.getFontMetrics().getDescent();
g2d.fillRect(0,0,xx,yy);
g2d.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_IN,alpha));
g2d.setPaint(颜色为红色);
g2d.抽绳(绳,xx/2-w2,yy/2+h2);
}
@凌驾
已执行的公共无效操作(操作事件e){
α+=δ;
如果(α<0){
α=1;
timer.restart();
}
重新油漆();
}
静态公共void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame f=新的JFrame();
f、 setLayout(新的GridLayout(0,1));
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 添加(新AlphaTest());
f、 添加(新AlphaTest());
f、 添加(新AlphaTest());
f、 包装();
f、 setVisible(真);
}
});
}
}

下面是一个使用alpha透明度的示例。您可以使用查看使用不同颜色、模式和字母的结果

import java.awt.*;
导入java.awt.event.*;
导入java.awt.event.ActionListener;
导入javax.swing.*;
公共类AlphaTest扩展JPanel实现ActionListener{
私有静态最终字体字体=新字体(“衬线”,Font.PLAIN,32);
private static final String=“Mothra alert!”;
专用静态最终浮动增量=-0.1f;
专用静态最终计时器=新计时器(100,空);
专用浮点数α=1f;
字母测试(){
这
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import javax.swing.*;

public class AlphaTest extends JPanel implements ActionListener {

    private static final Font FONT = new Font("Serif", Font.PLAIN, 32);
    private static final String STRING = "Mothra alert!";
    private static final float DELTA = -0.1f;
    private static final Timer timer = new Timer(100, null);
    private float alpha = 1f;

    AlphaTest() {
        this.setPreferredSize(new Dimension(256, 96));
        this.setOpaque(true);
        this.setBackground(Color.black);
        timer.setInitialDelay(1000);
        timer.addActionListener(this);
        timer.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setFont(FONT);
        int xx = this.getWidth();
        int yy = this.getHeight();
        int w2 = g.getFontMetrics().stringWidth(STRING) / 2;
        int h2 = g.getFontMetrics().getDescent();
        g2d.fillRect(0, 0, xx, yy);
        g2d.setComposite(AlphaComposite.getInstance(
            AlphaComposite.SRC_IN, alpha));
        g2d.setPaint(Color.red);
        g2d.drawString(STRING, xx / 2 - w2, yy / 2 + h2);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        alpha += DELTA;
        if (alpha < 0) {
            alpha = 1;
            timer.restart();
        }
        repaint();
    }

    static public void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setLayout(new GridLayout(0, 1));
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new AlphaTest());
                f.add(new AlphaTest());
                f.add(new AlphaTest());
                f.pack();
                f.setVisible(true);
            }
        });
    }
}