2015-10-25 3 views
1

Я пытаюсь вычеркнуть прозрачный овал затухания, чтобы выделить плитку на черепичном экране. К сожалению, я не смог найти реализованную функцию в 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; 
    } 

} 

В результате овал выглядит (урожай больше, чем овальные рамки):

enter image description here

Результат не является гладким овалом, есть «крест» и некоторые другие мелкие артефакты.

Я предполагаю, что это вызвано «перекрывающимися» пикселями, которые нарисованы друг над другом.

Есть ли разумный способ крепления этого устройства?

Обратите внимание, что я предпочитаю избегать реализации решения более низкого уровня, например, манипулирования отдельными пикселями на уровне Raster просто потому, что усилия связаны с огромным количеством переменных, не упомянутых выше.

ответ

4

Почему бы не использовать объект 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(); 
      } 
     }); 
    } 
} 

Это будет отображаться как:

enter image description here

+0

+1 за усилия, но градиенты решения между цветами. Есть ли способ использовать его с прозрачностью? Решение не должно отменять предыдущие значения пикселей. –

+0

будет устанавливать 'COLORS = {новый цвет (1f, 1f, 1f, 0.5f), новый цвет (1f, 1f, 1f, 0)' работает? –

+2

(1+) для картины @DimaMaligin - 'будет установка .... работать?' Почему вы не пытаетесь? Только вы знаете точное требование. – camickr

Смежные вопросы