comparison game/IDMButton.java @ 169:32b1c41e194a

Implement smooth scaling of buttons.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 02 Mar 2017 14:18:21 +0200
parents dda7152d2402
children 981a8e20b363
comparison
equal deleted inserted replaced
168:159252f9480d 169:32b1c41e194a
14 14
15 public class IDMButton extends IDMWidget 15 public class IDMButton extends IDMWidget
16 { 16 {
17 enum State { FOCUSED, PRESSED, NORMAL } 17 enum State { FOCUSED, PRESSED, NORMAL }
18 State state; 18 State state;
19 static BufferedImage imgUp, imgPressed; 19 static BufferedImage imgOrigUnpressed, imgOrigPressed;
20 static BufferedImage imgUnpressed, imgPressed;
20 Font font; 21 Font font;
21 FontMetrics metrics; 22 FontMetrics metrics;
22 String text; 23 String text;
23 boolean active; 24 boolean active;
24 25
25 public IDMButton(IDMPoint pos, int keyCode, Font font, String text) 26 public IDMButton(IDMPoint pos, int keyCode, Font font, String text)
26 { 27 {
27 super(pos); 28 super(pos);
28 loadImages(); 29 loadImages();
29 setSize(imgUp.getWidth(), imgUp.getHeight()); 30 setSize(imgOrigUnpressed.getWidth(), imgOrigUnpressed.getHeight());
31 setScale(1, 1);
30 32
31 this.font = font; 33 this.font = font;
32 this.keyCode = keyCode; 34 this.keyCode = keyCode;
33 this.text = text; 35 this.text = text;
34 36
41 this(new IDMPoint(x, y), keyCode, font, text); 43 this(new IDMPoint(x, y), keyCode, font, text);
42 } 44 }
43 45
44 private static void loadImages() 46 private static void loadImages()
45 { 47 {
46 if (imgUp != null && imgPressed != null) 48 if (imgUnpressed != null && imgPressed != null)
47 return; 49 return;
48 50
49 try 51 try
50 { 52 {
51 ResourceLoader res = new ResourceLoader("graphics/button1_up.png"); 53 ResourceLoader res = new ResourceLoader("graphics/button1_up.png");
52 imgUp = ImageIO.read(res.getStream()); 54 imgOrigUnpressed = ImageIO.read(res.getStream());
53 55
54 res = new ResourceLoader("graphics/button1_down.png"); 56 res = new ResourceLoader("graphics/button1_down.png");
55 imgPressed = ImageIO.read(res.getStream()); 57 imgOrigPressed = ImageIO.read(res.getStream());
56 } 58 }
57 catch (IOException e) 59 catch (IOException e)
58 { 60 {
59 System.out.print(e.getMessage()); 61 System.out.print(e.getMessage());
60 } 62 }
61 } 63 }
62 64
63 public void scale() 65 public BufferedImage scaleImage(BufferedImage src)
64 { 66 {
67 BufferedImage dst = new BufferedImage(getScaledWidth(), getScaledHeight(), BufferedImage.TYPE_INT_ARGB);
68 Graphics2D gimg = dst.createGraphics();
69
70 gimg.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
71 RenderingHints.VALUE_INTERPOLATION_BICUBIC);
72
73 gimg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
74 RenderingHints.VALUE_ANTIALIAS_ON);
75
76 gimg.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
77 RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
78
79 gimg.drawImage(src, 0, 0, getScaledWidth(), getScaledHeight(), null);
80 return dst;
81 }
82
83 public void setScale(IDMPoint scale)
84 {
85 super.setScale(scale);
86 imgPressed = scaleImage(imgOrigPressed);
87 imgUnpressed = scaleImage(imgOrigUnpressed);
65 } 88 }
66 89
67 public void paint(Graphics2D g) 90 public void paint(Graphics2D g)
68 { 91 {
69 BufferedImage img; 92 BufferedImage img;
75 xoffs = yoffs = 5; 98 xoffs = yoffs = 5;
76 } 99 }
77 else 100 else
78 { 101 {
79 xoffs = yoffs = 0; 102 xoffs = yoffs = 0;
80 img = imgUp; 103 img = imgUnpressed;
81 } 104 }
82 105
83 if (metrics == null) 106 if (metrics == null)
84 metrics = g.getFontMetrics(font); 107 metrics = g.getFontMetrics(font);
85 108
86 int textWidth = metrics.stringWidth(text); 109 int textWidth = metrics.stringWidth(text);
87 g.drawImage(img, 110 g.drawImage(img, getScaledX() + xoffs, getScaledY() + yoffs, null);
88 getScaledX() + xoffs, getScaledY() + yoffs,
89 getScaledWidth(), getScaledHeight(),
90 null);
91
92 g.setFont(font); 111 g.setFont(font);
93 g.setPaint(Color.black); 112 g.setPaint(Color.black);
94 g.drawString(text, 113 g.drawString(text,
95 getScaledX() + xoffs + (getScaledWidth() - textWidth) / 2, 114 getScaledX() + xoffs + (getScaledWidth() - textWidth) / 2,
96 getScaledY() + yoffs + getScaledHeight() / 2); 115 getScaledY() + yoffs + getScaledHeight() / 2);