[英]Drawing an out fading transparent oval
我正在尝试绘制褪色的透明椭圆形,以在平铺的屏幕上突出显示平铺的瓷砖。 不幸的是,我无法在Swing
中找到可以实现这一目标的实现功能,因此我编写了自己的功能:
private void drawGradientedOval(Graphics2D g2d, Rectangle bounds) {
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int loops = (int) Math.min(bounds.getWidth() / 2, bounds.getHeight() / 2);
int x = bounds.x + (int) (bounds.getWidth() / 2);
int y = bounds.y + (int) (bounds.getHeight() / 2);
int scale = 1;
float alpha = 0.5f;
float step = alpha / loops;
for (int i = 0; i < loops; i++) {
g2d.setColor(new Color(1f, 1f, 1f, alpha));
g2d.drawOval(x--, y--, scale, scale);
scale += 2;
alpha -= step;
}
}
生成的椭圆形看起来像(作物大于椭圆形边界):
结果不是光滑的椭圆,而是出现了“十字”和其他一些小瑕疵。
我认为这是由于彼此重叠绘制的“重叠”像素引起的。
有解决这个问题的聪明方法吗?
请注意,我宁愿避免实施较低级别的解决方案,例如在Raster
级别上处理单个像素,这仅仅是因为工作量涉及上面未提及的大量变量。
为什么不使用RadialGradientPaint对象进行绘画呢? 就像是:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RadialGradientPaint;
import javax.swing.*;
@SuppressWarnings("serial")
public class GradOval extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private static final Color BG = Color.BLACK;
private static final float[] FRACTIONS = {0.0f, 1.0f};
private static final Color[] COLORS = {Color.LIGHT_GRAY, new Color(0, 0, 0, 0)};
public GradOval() {
setBackground(BG);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
float cx = getWidth() / 2f;
float cy = getHeight() / 2f;
float radius = cx;
Paint paint = new RadialGradientPaint(cy, cy, radius, FRACTIONS, COLORS);
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(paint);
g2.fillRect(0, 0, getWidth(), getHeight());
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
GradOval mainPanel = new GradOval();
JFrame frame = new JFrame("GradOval");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
这将显示为:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.