簡體   English   中英

繪制褪色的透明橢圓形

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM