23

JPanel から画像を継承するクラスがあり、小さなアニメーションを設定してパネル/画像を表示し、イベントが発生したときにフェードアウトしたいと考えています。

私はおそらくスレッドを設定してアニメーションを起動しますが、実際にフェードを行うにはどうすればよいですか?

4

3 に答える 3

14

スレッド化は自分で行うこともできますが、 Tridentライブラリを使用して処理する方が簡単な場合があります。クラスに (たとえばsetOpacity) というセッターを作成すると、特定の期間にわたって「不透明度」フィールドを 1.0 から 0.0 に補間するようにトライデントに依頼できます (トライデントの使用方法に関するドキュメントの一部を次に示します)。

画像をペイントするときAlphaComposite、コンポジットのアルファ パラメータの更新された「不透明度」値を使用して、透明度を で行うことができます。アルファ合成の例を含む Sun のチュートリアルがあります。

于 2010-02-09T12:09:49.633 に答える
13

アルファ透明度を使用した例を次に示します。この合成ツールを使用して、さまざまな色、モード、およびアルファを使用した結果を確認できます。

画像

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);
            }
        });
    }
}
于 2010-02-10T02:26:10.790 に答える
6

画像の透明度に関する有用な情報がここにあります

あなたのアプローチは次のようになります。

  • SwingTimerを定義しActionEventて、N ミリ秒ごとにイベント ディスパッチ スレッドで を起動します。
  • を含む を呼び出す必要があるActionListenerに を追加します。Timerrepaint()ComponentImage
  • ComponentpaintComponent(Graphics)メソッドを オーバーライドして、次のことを行います。
    • Graphicsオブジェクトを にキャストしますGraphics2D
    • を使用AlphaCompositeしてを設定します。これは、透明度のレベルを制御します。Graphics2DsetComposite
    • イメージを描きます。

フェードアウト アニメーションの反復ごとに、 の値を変更しAlphaCompositeて画像をより透明にします。

于 2010-02-09T12:14:31.930 に答える