Java de fondu d'images
Je suis en train d'apprendre à s'estomper dans et hors des images dans une autre image ou d'une autre image. Donc, si j'ai 2 images, et 1 est affichée à l'instant, je veux afficher une autre image en arrière-plan et à la décoloration, la première image dans la 2ème image. OU, je tiens à mettre l'accent sur la nouvelle image et lentement en fondu sur la 1ère image, puis arrêter l'affichage de la 1ère.
Je ne suis pas sûr de savoir comment:
- pour définir le focus, si nécessaire.
- Je peux fondu si je change l'alpha à 0 et l'incrément et seulement de dessiner une image, mais je ne peux pas l'obtenir à s'estomper avec n'importe quelle variation de ce code. (c'est à dire en commentant une image pour dessiner).
Edit: Vraiment, je suis inquiète, c'est être capable d'avoir 2 images et de rendre l'image actuellement affichée lentement disparaître dans la 2ème image. Comment cela est accompli n'a pas besoin d'être avec cette.
Voici un exemple de code que je vais vous embêter avec:
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class FadeIn extends JPanel implements ActionListener {
private Image imagem;
private Image image2;
private Timer timer;
private float alpha = 1f;
public FadeIn() {
imagem = (new ImageIcon(getClass().getResource(
"/resources/1stImage.jpg"))).getImage();
image2 = (new ImageIcon(getClass().getResource(
"/resources/2ndImage.jpg"))).getImage();
timer = new Timer(20, this);
timer.start();
}
//here you define alpha 0f to 1f
public FadeIn(float alpha) {
imagem = (new ImageIcon(getClass().getResource(
"/resources/1stImage.jpg"))).getImage();
this.alpha = alpha;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(imagem, 0, 0, 400, 300, null);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
alpha));
g2d.drawImage(image2, 0, 0, 400, 300, null);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Fade out");
frame.add(new FadeIn());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(420, 330);
//frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
alpha += -0.01f;
if (alpha <= 0) {
alpha = 0;
timer.stop();
}
repaint();
}
}
Fondamentalement dessiner une image en arrière-plan, et un autre en face de lui. Puis fondu de l'image du haut à l'aide de la minuterie. Au lieu d'un fond blanc, il serait l'image du bas. J'ai été en mesure de le faire si je viens de remplir un rectangle sur l'écran, mais je ne peux pas définir l'image en arrière-plan.
OriginalL'auteur user2079828 | 2013-12-03
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, ce que cela fait, est d'utiliser la même valeur alpha, en fondu entre 0 et 1 puis en utilisant le même alpha, passant de 1-0, en permettant aux deux images cross fade les uns sur les autres...
La magie fondamentalement, ce qui se passe dans le
paintComponent
, où l'image à l'aide de laalpha
de la valeur et de la sortie d'image utilise1f - alpha
.De commutation entre les deux images est en fait un même processus, attendons la
inImage
est échangé pour laoutImage
Le timing est un peu différent. Au lieu d'un déplacement linéaire de
0-1
à l'aide d'un delta (c'est à dire0.01
par exemple), il utilise une base de temps de l'algorithme.Qui est, je l'ai utiliser une minuterie qui les tiques toutes les 40 millisecondes ou alors, il effectue ensuite un calcul basé sur la quantité de temps que la minuterie est en cours d'exécution et calcule la
alpha
valeur en conséquence...Cela permet de modifier la quantité de temps que l'animation prendra, mais fournit également un peu mieux algorithme qui prend en compte la nature passive de Balançoires moteur de rendu...
Vous pouvez le faire à l'aide d'une droite delta, je viens de trouver une heure selon l'une fournit un meilleur résultat 😉
Haha, eh bien, vous êtes plus d'expérience que moi donc je vais prendre votre mot pour ça :p j'ai eu ce travail parfaitement après j'ai compris comment charger une image à partir de ressources à l'aide de la ImageIO.lire. Je n'avais jamais utilisé un BufferedImage avant. Serait-ce de travailler avec un avion vieux 'Image' type?
BufferedImage
s'étendImage
, de sorte qu'il devrait...Heureux, il a aidé 😉 - j'ai l'habitude de l'animation de la bibliothèque pour effectuer ce genre de travail. Personnellement, j'utilise le TimingFramework mais Trident est très similaire et la Java Universelle Interpolation Moteur semble intéressant.
OriginalL'auteur MadProgrammer