笔划Stroke
Graphics2D的draw方法,使用当前设置的笔划(Stroke)来画形状的边界。
可以使用Graphics2D的setStroke方法,来设置当前的笔划(Stroke)。
需要给setStroke方法提供一个实现了Stroke接口的入参。BasicStroke类实现了Stroke接口,也是Java 2D API中唯一一个实现了Stroke接口的类。
现在看下BasicStroke类怎么构造:BasciStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase)
width 表面笔划的宽度,默认是宽度为1个像素。
cap 笔划端口样式,针对像素大于1的情况。有以下三种:
1. 平头样式(butt cap) 在笔划的末端处就结束了
2. 圆头样式(round cap)在笔划的末端处加了一个半圆
3. 方头样式(square cap)在笔划的末端处加了半个方块
join 定义两个较粗的笔划相遇时的情况,有以下三种:
1. 斜连接(bevel join),用一条直线将两个笔划连接起来,该直线与两个笔划之间的夹角的平分线垂直。
2. 圆连接(round join),延长了每个笔划,并使其带有一个圆头。
3. 斜尖连接(miter join),通过增加一个尖峰,从而同时延长了两个笔划。
miterlimit
dash
dash_phase
着色Paint
Graphics2D的fill方法,使用当前设置的着色Paint来填充形状的内部。
可以使用Graphics2D的setPaint方法,来设置当前的着色Paint。
需要给setPaint方法提供一个实现了Paint接口的入参。Java 2D API中,提供了三个实现了Paint接口的类:
Color类:g2d.setPaint(Color.RED);
GradientPaint类:通过在两个给定的颜色值之间进行渐变,从而改变使用的颜色。g2d.setPaint(new GradientPaint(p1, Color.RED, P2, Color.YELLOW);
TexturePaint类:用一个图像重复地对一个区域进行着色。g2d.setPaint(new TexturePaint(bufferedImage, anchorRectangle));
坐标转换
比例缩放:放大或者缩小从一个固定点出发的所有距离。
旋转:环绕着一个固定中心旋转所有点。
平移:将所有点移动一个固定的量。
切变:
Graphics2D提供了4个方法,scale、rotate、translate和shear,对应上述四种转换。
可以组合这些操作:
g2d.rotate(angle);
g2d.scale(2,2);
g2d.draw(。。。。。。);
这种情况,变换的顺序是无关紧要的。但下述情况变换顺序就很重要了:
g2d.translate(x,y); // 将某个形状从原点处移回到(x,y)
g2d.rotate(angle); // 旋转
g2d.translate(-x,-y); // 将某个形状从点(x,y)处移动到原点
注意变换是逆序执行的,最后一个变换操作是第一个被应用的。以上三步实现了将形状安装某个指定的点进行旋转。等价于g2d.rotate(angle,x,y)。
仿射变换(affine transformation),AffineTransform类:
AffineTransform t = new AffineTransform(a,b,c,d,e,f);
g2d.setTransform(t); // 用t替换当前的transformation
g2d.transform(t); // 将t和当前的transformation组合起来
AffineTransform oldTransform = g2d.getTransform(); // 保存旧的transform
g2d.transform(t); // apply temporary transform
// now draw
g2d.setTransform(oldTransform); // 画完后,恢复。