我一直在試圖爲我正在開發的小遊戲實現基本文本泡泡。不想去太花哨,我開始與一個基本的圓角矩形包含一些文本邊框:
在BufferedImage上繪製帶有不透明度的圓角矩形
於是,我決定,文字氣泡應該在預設時間之後淡出。這就是我偶然發現的一個問題:當我試圖在測試窗口中顯示氣泡時,一切運行良好,但是當我將它們展示在遊戲中時,泡泡消失時出現了扭曲。我測試了一些,調試了一下,發現兩種情況之間唯一的區別是在測試窗口中我用paintComponent方法的Graphics畫了泡泡,而在遊戲中我使用BufferedImages來模擬圖層並使用image.createGraphics中的圖形。然後我可以成功複製的bug:
在這裏,你看到的是,當左邊的泡沫漸弱,其圓角右側的圓角不改變而改變形狀相比褪色之前,而泡沫。事實上,左側的氣泡是在BufferedImage上繪製的,然後在面板上繪製,而右側的氣泡直接繪製在面板上。
我已經分離出這是需要重現該問題的代碼:
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(400, 400);
JPanel panel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics graphics = image.createGraphics();
paintExampleBubble(graphics, 50, 50);
g.drawImage(image, 0, 0, this);
paintExampleBubble(g, 250, 50);
}
};
frame.getContentPane().add(panel);
frame.setVisible(true);
}
private static final Color background = new Color(1f, 1f, 1f, 0.5f);
private static final Color foreground = new Color(0f, 0f, 0f, 0.5f);
private static final int borderRadius = 16;
private static final int width = 100;
private static final int height = 50;
private static void paintExampleBubble(Graphics g, int x, int y) {
g.setColor(background);
g.fillRoundRect(x, y, width, height, borderRadius, borderRadius);
g.setColor(foreground);
g.drawRoundRect(x, y, width, height, borderRadius, borderRadius);
}
這裏是上面的代碼產生的結果:
不管怎麼說,這表明拉伸到BufferedImage的是什麼原因導致這個問題,但是暫時放棄BufferedImages不是一個選擇。
我試圖調試代碼來查看可能會導致這種差異的原因,並且只能注意到圖形對象在涉及透明度時使用不同的組件繪製,但是這並不能幫助我解決我的問題,即使有可能強制圖形做我想要的,我寧願儘可能避免黑客入侵。
有沒有人知道一個相對簡單而有效的方法來解決這個問題,或解決它?
不管怎麼說,感謝百忙之中閱讀本文時:)
PS:由於這是第一次我問一個問題,我可能已經錯過了一些東西,所以隨時告訴我如果是這樣的案件 !這將非常感激。
編輯:正如我在評論中所說,遊戲是基於像素藝術的,因此我寧願不使用抗鋸齒,但保留圓角矩形的基本像素化外觀。
不完全相信如果我正確地看到你的描述失真,但嘗試打開反鋸齒'g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON)'其中'g'是'Graphics2D'的一個實例 – copeg
感謝您的快速回答!我現在已經嘗試過了,它確實有效(因爲在透明度啓動時邊框不再改變)。然而,我沒有提到這一點,我正在研究的遊戲只具有像素藝術圖形和自動抗鋸齒功能,而且由於分辨率低,看起來很模糊。我會更新我的問題來澄清 – Niss36
並沒有真正遵循你正在嘗試做的事情,但是這裏有一個可能(或可能不)給你使用不同方法的帖子:http://stackoverflow.com/問題/ 15025092/border-with-rounded-corners-transparency – camickr