焦点を中心点と異なる位置に設定する

広告

RadialGradientPaintクラスを使って円放射状グラデーションパターンを使う場合、円の中心点とは異なる位置に始点である焦点を設定することができます。

焦点を別途設定するには3番目のコンストラクタを使います。

デフォルトの SRGB カラースペースで RadialGradientPaint を構築します。

パラメータ:
  cx - グラデーションを定義する円の中心点の、ユーザー空間での X 座標。
    グラデーションの最後の色は、この円の円周にマップされる
  cy - グラデーションを定義する円の中心点の、ユーザー空間での Y 座標。
    グラデーションの最後の色は、この円の円周にマップされる
  radius - 色のグラデーションの広がりを定義する 円の半径
  fx - 最初の色がマップされる、ユーザー空間内の点の X 座標
  fy - 最初の色がマップされる、ユーザー空間内の点の Y 座標
  fractions - 0.0 - 1.0 の範囲の数値。 グラデーションでの色分布を指定
    する
  colors - グラデーションで使用される色の配列。最初の色は 焦点で使用さ
    れ、最後の色は 円周で使用される
  cycleMethod - NO_CYCLE、REFLECT、 REPEAT のいずれか 
例外: 
  NullPointerException - fractions 配列が null の場合、colors 配列がnull
    の場合、 または cycleMethod が null の場合 
  IllegalArgumentException - radius が正でない場合、
    fractions.length != colors.length である場合、 colors のサイズが 2 
    より小さい場合、 fractions の値が 0.0 より小さいか 1.0 より大きい場
    合、または fractions が厳密な昇順で指定されない場合

基本的な引数の設定については『RadialGradientPaintクラスによるグラデーションの指定』を参照して下さい。

異なる点は円の中心点とは別に始点となる焦点の座標を5番目と6番目の引数で指定している点です。グラデーションは焦点から円周上の各点に対して行われます。

具体的には次のように記述します。

public void paintComponent(Graphics g){
  Graphics2D g2 = (Graphics2D)g;
  
  float[] dist = {0.0f, 0.4f, 1.0f};
  Color[] colors = {Color.RED, Color.WHITE, Color.BLUE};
  
  RadialGradientPaint gradient = new RadialGradientPaint(
      50.0f, 50.0f, 
      60.0f,
      40.0f, 40.0f, 
      dist,
      colors,
      MultipleGradientPaint.CycleMethod.NO_CYCLE
  );
  g2.setPaint(gradient);

  g2.fill(new Rectangle2D.Double(20, 20, 200, 130));
}

「setPaint」メソッドを実行した後で実行された「draw」メソッド及び「fill」メソッドで設定が反映されます。

Point2Dクラスによる座標指定

中心点及び焦点の座標を指定する方法としてPoint2Dクラスのオブジェクトを使用するコンストラクタも用意されています。6番目のコンストラクタを見てみます。

デフォルトの SRGB カラースペースで RadialGradientPaint を構築します。

パラメータ:
  center - ユーザー空間で、グラデーションを定義する円の 中心点。グラデー
    ションの最後の色は、 この円の円周にマップされる
  radius - 色のグラデーションの広がりを定義する 円の半径
  focus - 最初の色がマップされるユーザー空間内の点
  fractions - 0.0 - 1.0 の範囲の数値。 グラデーションでの色分布を指定する
  colors - グラデーションで使用される色の配列。最初の色は 焦点で使用さ
    れ、最後の色は 円周で使用される
  cycleMethod - NO_CYCLE、REFLECT、 REPEAT のいずれか 
例外: 
  NullPointerException - 点のいずれかが null の場合、fractions 配列がnull
    の場合、 colors 配列が null の場合、 または cycleMethod が null の場合 
  IllegalArgumentException - radius が正でない場合、
    fractions.length != colors.length である場合、 colors のサイズが 2 
    より小さい場合、 fractions の値が 0.0 より小さいか 1.0 より大きい場
    合、 または fractions が厳密な昇順で指定されない場合

違いは中心点及び焦点の座標をPoint2Dクラスのオブジェクトを使って指定している点だけです。

Point2Dクラスは二次元空間における座標を表す2つの値を保持するためのクラスです。Point2Dクラスはabstractクラスであるため実際にはサブクラスであるPoint2D.DoubleクラスやPoint2D.Floatクラスを使います。詳しくは『Point2Dクラス』を参照して下さい。

具体的には次のように記述します。

public void paintComponent(Graphics g){
  Graphics2D g2 = (Graphics2D)g;
  
  float[] dist = {0.0f, 0.4f, 1.0f};
  Color[] colors = {Color.RED, Color.WHITE, Color.BLUE};
  
  RadialGradientPaint gradient = new RadialGradientPaint(
      new Point2D.Double(50.0d, 50.0d), 
      60.0f,
      new Point2D.Double(40.0d, 40.0d), 
      dist,
      colors,
      MultipleGradientPaint.CycleMethod.NO_CYCLE
  );
  g2.setPaint(gradient);

  g2.fill(new Rectangle2D.Double(20, 20, 200, 130));
}

サンプルプログラム

簡単なサンプルを一度試してみます。

PaintTest8.java

import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.*;
import java.awt.Color;
import java.awt.RadialGradientPaint;
import java.awt.MultipleGradientPaint;

public class PaintTest8 extends JPanel{

  public static void main(String[] args){
    JFrame frame = new JFrame();

    PaintTest8 app = new PaintTest8();
    frame.getContentPane().add(app);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D)g;

    float[] dist = {0.0f, 0.4f, 1.0f};
    Color[] colors = {Color.RED, Color.WHITE, Color.BLUE};

    RadialGradientPaint gradient = new RadialGradientPaint(
        100.0f, 80.0f, 
        60.0f,
        60.0f, 60.0f, 
        dist,
        colors,
        MultipleGradientPaint.CycleMethod.NO_CYCLE
        // MultipleGradientPaint.CycleMethod.REFLECT
        // MultipleGradientPaint.CycleMethod.REPEAT
    );
    g2.setPaint(gradient);

    g2.fill(new Rectangle2D.Double(20, 20, 200, 130));
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

中心点と焦点を別々に設定する

今回はグラデーション方式として非循環式を設定しています。

それではグラデーション方式として「MultipleGradientPaint.CycleMethod.REFLECT」を設定した場合と「MultipleGradientPaint.CycleMethod.REPEAT」を設定した場合の結果だけ見ておきます。

MultipleGradientPaint.CycleMethod.REFLECT:

中心点と焦点を別々に設定する

MultipleGradientPaint.CycleMethod.REPEAT:

中心点と焦点を別々に設定する

( Written by Tatsuo Ikura )