#java #графика #graphics #awt
Как в Java сделать фигуру полупрозрачной? Есть ли встроенные методы для этого?
Например, рисую круг и заливаю его красным цветом. Потом поверх него рисую прямоугольник,
больший по размеру и заливаю его, допустим, синим цветом. Необходимо поставить для
прямоугольника определенный уровень полупрозрачности для того, чтобы был виден и круг
под ним.
Возможно ли это сделать?
Ответы
Ответ 1
Можно или установить цвету прозрачность, или, для более сложных случаев, использовать AlphaComposite public class Alpha { static void initUi() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE ); JPanel colorWithAlpha = new JPanel() { @Override public void paintComponent( Graphics g ) { g.setColor( Color.WHITE ); g.fillRect( 0, 0, getWidth(), getHeight() ); g.setColor( Color.RED ); g.fillOval( 0, 0, getWidth(), getHeight() ); // rgba, a - альфа-канал, непрозрачность g.setColor( new Color(0, 0, 255, 128) ); g.fillRect( 0, getHeight()/3, getWidth(), getHeight()/3 ); } }; JPanel alphaComposite = new JPanel() { @Override public void paintComponent( Graphics g ) { Graphics2D g2d = (Graphics2D)g.create(); try { g2d.setColor( Color.WHITE ); g2d.fillRect( 0, 0, getWidth(), getHeight() ); g2d.setColor( Color.RED ); g2d.fillOval( 0, 0, getWidth(), getHeight() ); // композит SrcOver отображает исходное изображение (src, // прямоугольник), поверх целевого изображения, с заданной // в derive( float ) alpha AlphaComposite composite = AlphaComposite.SrcOver.derive( 0.5f ); g2d.setComposite( composite ); g2d.setColor( Color.BLUE ); g2d.fillRect( 0, getHeight()/3, getWidth(), getHeight()/3 ); } finally { g2d.dispose(); } } }; JPanel content = new JPanel( new GridLayout( 1, 2 ) ); content.add( colorWithAlpha ); content.add( alphaComposite ); frame.setContentPane( content ); frame.setSize( 800, 600 ); frame.setVisible( true ); } public static void main(String[] args) throws IOException { EventQueue.invokeLater( Alpha::initUi ); } } Обучалка от Oracle по композитам
Комментариев нет:
Отправить комментарий