Bonjour à tous,
Après avoir regardé les faq et autres infos sur le double buffering hardware ou software, je me retrouve en difficulté pour l'appliquer. Si l'un d'entre vous peux m'aiguiller sur la façon de faire![]()
J'ai un jgoodie qui lance une petite animation de fading sur un Quit button mais je me retrouve avec cet effet que bcp d'entre vous on du surrement déjà avoir et c 'est vrai que c est tout moche tout moche!
Donc si quelqu'un peut jeter un coup d'oeil sur le code ci dessous et m'aiguiller pour réussir avec du double buffering Hard ou soft ca serrait coolmerci!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Robot; import java.awt.Toolkit; import java.awt.Window; import java.awt.image.BufferedImage; import javax.swing.JComponent; import javax.swing.JFrame; public class Dissolver extends JComponent implements Runnable{ Frame frame; Window fullscreen; int count; BufferedImage frame_buffer; BufferedImage screen_buffer; //2nd buffer Graphics buffer; Image image; public Dissolver(){} public void update(Graphics g){ paint(g); } public void dissolveExit(JFrame frame){ try{ this.frame = frame; Robot robot = new Robot(); //cap screen w/ frame to frame buffer Rectangle frame_rect = frame.getBounds(); frame_buffer = robot.createScreenCapture(frame_rect); //hide frame frame.setVisible(false); //cap screen w/o frame Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); Rectangle screen_rect = new Rectangle(0,0,screensize.width, screensize.height); screen_buffer = robot.createScreenCapture(screen_rect); //create big window w/o decorations fullscreen = new Window(new JFrame()); fullscreen.setSize(screensize); fullscreen.add(this); this.setSize(screensize); fullscreen.setVisible(true); //start animation new Thread(this).start(); }catch(Exception e){ System.out.println(""+e); } } public void run(){ try{ count = 0; Thread.sleep(100); for(int i=0; i<20; i++){ count = i; fullscreen.repaint(); Thread.sleep(100); } System.exit(0); }catch(Exception e){ System.out.println(""+e); System.exit(0); } } public void paint(Graphics g){ Graphics2D g2 = (Graphics2D)g; //création du buffer si il n'existe pas if(buffer==null){ image = createImage(fullscreen.getWidth(),fullscreen.getHeight()); buffer = image.getGraphics(); } /** Désactivation de l'anti-aliasing */ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); /** Demande de rendu rapide */ g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED); g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF); g2.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE); //draw the screen, offset in case the window isn't at 0,0 g.drawImage(screen_buffer, -fullscreen.getX(), -fullscreen.getY(), null); //draw the frame Composite old_comp = g2.getComposite(); Composite fade = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f-((float)count)/20f); g2.setComposite(fade); g2.drawImage(frame_buffer, frame.getX(), frame.getY(), null); g2.setComposite(old_comp); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextField; import com.rfo.framework.gui.tools.Dissolver; import com.rfo.framework.gui.tools.SpinDissolver; public class Test { static JTextField text; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub final JFrame frame = new JFrame("Test"); JButton quit = new JButton("Quit"); quit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent evt){ new SpinDissolver().dissolveExit(frame); } }); frame.getContentPane().add(quit); frame.pack(); frame.setLocation(300,300); frame.setSize(400,400); frame.setVisible(true); } }[ Sujet déplacé depuis le forum java par Viena ]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; public class SpinDissolver extends Dissolver{ public void paint(Graphics g){ Graphics2D g2 = (Graphics2D)g; /** Désactivation de l'anti-aliasing */ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); /** Demande de rendu rapide */ g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED); g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF); g2.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE); //draw the screen, offset in case the window isn't at 0,0 g.drawImage(screen_buffer, -fullscreen.getX(), -fullscreen.getY(), null); //save the current transform AffineTransform old_trans = g2.getTransform(); //move to the upper-lefthand corner of the frame g2.translate(frame.getX(), frame.getY()); //move the frame off toward the left g2.translate(-((count+1) * (frame.getX()+frame.getWidth())/20),0); //shrink the frame float scale = 1f /((float)count+1); g2.scale(scale,scale); //rotate around the center g2.rotate(((float)count)/3.14/1.3, frame.getWidth()/2, frame.getHeight()/2); //finally draw the frame g2.drawImage(frame_buffer, 0, 0, null); //restore the current transform g2.setTransform(old_trans); } }
Les Règles du Forum
Partager