如何在摇摆中淡化图像?

bla*_*ank 23 java animation swing fade

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

我可能会设置一个线程并触发动画,但我该怎么做呢?

Ash*_*Ash 14

您可以自己进行线程处理,但使用Trident库来处理它可能更容易.如果你在你的类上创建一个名为(例如setOpacity)的setter ,你可以让trident在特定的时间段内插入1.0到0.0的"不透明度"字段(这里有一些关于如何使用Trident 的文档).

在绘制图像时,可以AlphaComposite使用更新的"不透明度"值对复合材料的alpha参数执行透明度.有一个Sun教程包含一个alpha复合示例.


tra*_*god 13

这是使用alpha透明度的示例.您可以使用此复合工具查看使用不同颜色,模式和alpha的结果.

图片

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);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为了进行比较,请参见可更改背景颜色的[example](http://stackoverflow.com/questions/2123841/javax-swing-timer-repeats-fine-but-actionlistener-doesnt-do-anything/2124507#2124507)饱和。 (2认同)

Ada*_*ski 6

没有描述图像的透明度一些有用的信息在这里.

你的方法是这样的:

  • 定义Swing TimerActionEvent每N毫秒触发一次事件调度线程.
  • 一个添加ActionListenerTimer应该叫repaint()上你的Component包含Image.
  • 重写ComponentpaintComponent(Graphics)方法做到以下几点:
    • Graphics对象转换为Graphics2D.
    • 设置AlphaComposite在上Graphics2D使用setComposite.这可以控制透明度.
    • 画出图像.

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