TexturePaint, абстрактный класс MultipleGradientPaint и его расширения LinearGradientPaint и RadialGradientPaint. Класс Color нам известен, посмотрим, какие способы заливки предлагают классы GradientPaint и TexturePaint.
Классы
Класс GradientPaint предлагает сделать заливку следующим образом.
В двух точках, м и N, устанавливаются разные цвета. В точке M(x1, у1) задается цвет c1, в точке N(x2, у2) — цвет c2. Цвет заливки гладко меняется от c1 к c2 вдоль прямой, соединяющей точки М и N, оставаясь постоянным вдоль каждой прямой, перпендикулярной прямой mn. Такую заливку создает конструктор
GradientPaint(float x1, float у1, Color c1, float x2, float у2, Color c2);
При этом вне отрезка mn цвет остается постоянным: за точкой м — цвет c1, за точкой N - цвет c2.
Второй конструктор,
GradientPaint(float x1, float у1, Color c1,
float x2, float у2, Color c2, boolean cyclic);
при задании параметра cyclic == true повторяет заливку полосы mn во всей заливаемой фигуре.
Еще два конструктора задают точки как объекты класса Point2D.
Класс TexturePaint поступает сложнее. Сначала создается буфер — объект класса BufferedImage из пакета java.awt.image. Это большой сложный класс. Мы с ним еще встретимся в
Затем по буферу создается объект класса TexturePaint. При этом еще задается прямоугольник, размеры которого являются размерами образца заполнения. Конструктор выглядит так:
TexturePaint(BufferedImage buffer, Rectangle2D anchor);
После создания заливки — объекта класса Color, GradientPaint или TexturePaint — она устанавливается в графическом контексте методом setPaint(Paint p) и используется в дальнейшем методом fill (Shape sh).
Все это демонстрируют листинг 9.5 и рис. 9.5.
Листинг 9.5. Способы заливки
import java.awt.*; import java.awt.geom.*;
import java.awt.image.*; import javax.swing.*;
class PaintTest extends JFrame{
PaintTest(String s){ super(s);
setSize(300, 300); setVisible(true);
setDefaultCloseOperation(JFrame.EXIT ON CLOSE);
}
public void paint(Graphics gr){
Graphics2D g = (Graphics2D)gr;
BufferedImage bi =
new BufferedImage(20, 20, BufferedImage.TYPE INT RGB); Graphics2D big = bi.createGraphics(); big.draw(new Line2D.Double(0.0, 0.0, 10.0, 10.0)); big.draw(new Line2D.Double(0.0, 10.0, 10.0, 0.0));
TexturePaint tp = new TexturePaint(bi,
new Rectangle2D.Double(0.0, 0.0, 10.0, 10.0)); g.setPaint(tp);
g.fill(new Rectangle2D.Double(50,50, 200, 200)); GradientPaint gp =
new GradientPaint(100, 100, Color.white,
150, 150, Color.black, true);
g.setPaint(gp);
g.fill(new Ellipse2D.Double(100, 100, 200, 200));
}
public static void main(String[] args){ new PaintTest(" Способы заливки");
}
}
Рис. 9.5. Способы заливки |
Классы
Классы LinearGradientPaint и RadialGradientPaint позволяют сделать градиентную заливку несколькими цветами, повторяя их вдоль прямой или радиально, вдоль радиуса окружности. Общие свойства этих классов собраны в абстрактном суперклассе
MultipleGradientPaint.
Так же, как и в классе GradientPaint, задается промежуток mn, но теперь промежуток делится на несколько частей точками с вещественными координатами от 0.0 — начало промежутка — до 1.0 — конец промежутка. Эти точки заносятся в массив, например:
float[] dist = {0.0f, 0.2f, 1.0f};
Здесь промежуток разделен на две неравные части: одна пятая часть и четыре пятых части.
В каждой точке деления промежутка задается свой цвет. Цвета тоже записываются в массиве:
Color[] color = {Color.RED, Color.WHITE, Color.BLUE};
В каждой части промежутка цвет плавно меняется от одного цвета к другому. В нашем примере на одной пятой части промежутка идет переход от красного к белому цвету, а на оставшихся четырех пятых — переход от белого к синему цвету.
После этого для линейной заливки создается экземпляр класса LinearGradientPaint:
LinearGradientPaint(float x1, float у1, float x2, float у2, float[] dist, Color[] color);
а для радиальной заливки — экземпляр класса RadialGradientPaint.
RadialGradientPaint(float x, float у, float radius, float[] dist, Color[] color);
Как вы поняли, для линейной заливки задаются координаты начальной M(x1, у1) и конечной N(x2, у2) точки промежутка, а для радиальной заливки — координаты центра круга A(x, у) и радиус окружности radius.
Способы задания цветов вне промежутка mn заданы константами вложенного класса MultipleGradientPaint. cycleMethod. В шестой версии Java SE есть три способа:
□ no_cycle — используются первый и последний цвет (по умолчанию);
□ reflect — перед промежутком циклически перебираются цвета от первого до последнего, а после промежутка — от последнего до первого;