除了在Java中使用GradientPaint,还有其他选择吗?
基本上,现在,当我用纯色填充应用程序中的所有矩形时,我的代码可以接受地快速。
但是,一旦我开始使用GradientPaint,动作的性能就会下降1秒。
例如,一个动作是:单击图像,然后图像突然弹出。
我喜欢保持GradientPaint的外观,就像普通填充一样可怕……但是我不想失去性能。 GradientPaint是否有其他选择?
我希望我的问题不要太含糊,但似乎GradientPaint太慢了。我尝试手动实现GradientPaint,并且性能接近Java实现,因此可能表明GradientPaint根本无法更高效地完成。
使用GradientPaint的代码:
private void drawRectangle(final Graphics2D g2d, int width, int height, int x, int y, final int borderSize, final Color color) {
g2d.setColor(color);
g2d.fillRect(x, y, width, height);
//account for border distance
x += borderSize;
y += borderSize;
width -= 2 * borderSize;
height -= 2 * borderSize;
int mx = (int)Math.round(x + (width / 2));
int my = (int)Math.round(y + (height / 2));
Color colorEdge = alphaColor(color, 192);
Color colorInside = alphaColor(color, 128);
Composite oldComposite = g2d.getComposite();
g2d.setComposite(AlphaComposite.SrcIn);
g2d.setColor(color);
GradientPaint paintQ1 = new GradientPaint(x, y, colorEdge, mx, my, colorInside);
g2d.setPaint(paintQ1);
g2d.fillRect(x, y, mx - x, my - y);
GradientPaint paintQ2 = new GradientPaint(x + width - 1, y, colorEdge, mx, my, colorInside);
g2d.setPaint(paintQ2);
g2d.fillRect(mx, y, mx - x, my - y);
GradientPaint paintQ3 = new GradientPaint(x, y + height - 1, colorEdge, mx, my, colorInside);
g2d.setPaint(paintQ3);
g2d.fillRect(x, my, mx - x, my - y);
GradientPaint paintQ4 = new GradientPaint(x + width - 1, y + height - 1, colorEdge, mx, my, colorInside);
g2d.setPaint(paintQ4);
g2d.fillRect(mx, my, mx - x, my - y);
g2d.setComposite(oldComposite);
}
private Color alphaColor(final Color c1, final int alpha) {
return new Color(c1.getRed(), c1.getGreen(), c1.getBlue(), alpha);
}
每个图像仅被称为3次,覆盖的总面积约为500 x 700像素的两倍。
问候。
最佳答案
回答晚了6年,但对于发现它的任何人:
通常,Java Paint实例的工作方式是在后台分配非常大的栅格(int或字节数组),然后很快将其丢弃并在下次绘制时重新创建。 Java2D围绕着推动像素的方向在某种程度上使情况变得更加复杂,而现代图形流水线并非如此。
您可以在一些限制范围内解决此问题:如果您只是在进行水平或垂直渐变,将渐变绘制一次到与屏幕兼容的BufferedImage可能会更有效(您可以制作一个相当小的图像并将其垂直或水平平铺);对于我的需求,性能提高了约20倍。这是一个使用此方法的项目,可用作库:https://github.com/timboudreau/visual-library-tabcontrol/tree/master/colors/src/main/java/com/mastfrog/colors
当然,如果您要执行复杂的RadialGradientPaints,那将不是平铺的。可能可以以任意角度处理平铺,但这并非不平凡-在图形上设置变换以使平铺以所需的角度进行,并对所有形状进行变换以使它们以正常的方向显示。