Как я исчезаю изображение в колебании?

У меня есть класс, который наследовался JPanel с изображением на нем, и я хочу настроить немного анимации, чтобы отобразить панель/изображение и затем постепенно исчезнуть она, когда событие стреляет.

Я, по-видимому, настроил поток и исчерпываю анимацию, но как я делаю, на самом деле делают исчезновение?

23
задан blank 9 February 2010 в 11:45
поделиться

3 ответа

Вы можете выполнять потоки самостоятельно, но, возможно, будет проще использовать библиотеку Trident для его обработки. Если вы создаете сеттер в своем классе под названием (скажем, setOpacity ), вы можете попросить трезубец интерполировать поле «непрозрачности» с 1,0 до 0,0 за определенный период времени (вот некоторые из документы о том, как использовать Trident).

Когда вы рисуете изображение, вы можете сделать прозрачность с помощью AlphaComposite , используя обновленное значение «непрозрачности» для параметра альфа композиции. Существует руководство Sun, которое включает пример составного альфа-канала .

14
ответ дан 29 November 2019 в 02:27
поделиться

Вот пример использования альфа-прозрачности. Вы можете использовать этот составной инструмент , чтобы увидеть результат использования различных цветов, режимов и альфа-каналов.

image

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);
            }
        });
    }
}
13
ответ дан 29 November 2019 в 02:27
поделиться

Здесь имеется некоторая полезная информация, описывающая прозрачность изображения .

Вашим подходом было бы что-то вроде этого:

  • Определите Swing Timer для запуска ActionEvent в потоке отправки событий каждые N миллисекунд.
  • Добавьте ActionListener к Timer , который должен вызвать repaint() на компоненте Component , содержащем Image .
  • Переопределите метод Component paintComponent(Graphics), чтобы сделать следующее:
    • Отбросьте объект Graphics на Graphics2D.
    • Установите AlphaComposite на Graphics2D с помощью setComposite. Это контролирует уровень прозрачности.
    • Нарисуйте изображение.

Для каждой итерации вы будете изменять значения AlphaComposite, чтобы сделать изображение более прозрачным.

6
ответ дан 29 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: