Graphics2D 使用详解

Graphics2D 使用详解


2024年3月15日发(作者:)

Graphics2D 使用详解

Java 2D - How the Graphics2D Class Renders 正如我们在前面提到的,我们可以对

Graphics2D类进行多项设置。实际上,渲染引擎在绘制Graphics2D图形前会查看7个主要

的属性:

Paint

Stroke

Font

Transformation

Clipping space

Rendering hints

Compositing rule

让我们逐一讲解:

Paint

新的paint可以同时作用在边线和填充上了。Graphics2D类可以用setPaint()和getPaint()

方法配制paint属性: nt( paint); Paint paint =

nt();paint可以是单色,渐变和图案。任何paint都需要实现接口。

Java 2D类库中有三个类你应该感到熟悉:

:

Java 2D使用同样的常量。因为Color类实现了接口,所有的Color对象都是

Paint对象。

ntPaint:

这个类用颜色渐变填充一个区域。构造函数制定比例和颜色。图形引擎会从第一个点到第二

个点之间线性变化两个颜色。我们还可以指定颜色图案是否允许重复。

ePaint:

这个类平铺一个图像来填充图形。构造函数接收一个edImage和一

个Rectangle2D,把图像影射到矩形里,然后平铺矩形。

图3 显示ntPaint和ePaint的实例。

图 3. GradientPaint 和 TexturePaint

建立一个BufferedImage来保存图像相对是更直接的方法。在BufferedImage的构造函数

里制定长,宽,高,类型为_INT_RGB,然后调用createGraphics()方

法得到一个Graphics2D。

如果要用图片的话就需要更多的步骤。首先,从一个图片文件里读入Image对象,用

MediaTracker保证图片完全读入,然后建立和Image对象等宽高的空BufferedImage对象。

通过createGraphics()方法得到Graphics2D对象,最后把Image对象加载到bufferedImage

里。

Stroke

描边决定着图形或文字的轮廓。通过setStroke()方法定义描

边:: oke( stroke); stroke =

oke();在Java 2D出现以前,cs的描绘方法产生一个1像素宽的实

线边。Java 2D API给你更灵活的描边选择。边缘即可以是粗细不等的实线,也可以是等宽

点线。

setStroke()方法的参数必须实现接口。现在troke类是唯一

实现的类。下面是BasicStroke的构造函数:

BasicStroke():

这个构造建立一个1单位宽的描边。端点样式是默认的CAP_SQUARE,默认接头样式是默

认的 JOIN_MITER。

BasicStroke(float penWidth):

指定线宽,端点样式使用默认的CAP_SQUARE,默认接头样式使用默认的 JOIN_MITER。

BasicStroke(float penWidth, int capStyle, int joinStyle):

指定线宽,端点样式和接头样式。

BasicStroke(float penWidth, int capStyle, int joinStyle, float miterLimit):

基本同上,但可以设置拼接连接的延长度,默认是10。

BasicStroke(float penWidth, int capStyle, int joinStyle, float miterLimit,

float[] dashPattern, float dashOffset):

这个构造可以通过一个表明[透明,不透明的]数组,建立点线轮廓。offset是点线的起始位置,

一般是0,0。

正如这5个构造函数所示,BasicStroke类允许设定端点样式。型如下:

_BUTT: 端点直接切断。

_ROUND: 以线宽为直径的圆形端点。

_SQUARE: 半线宽单位延伸的方块端点。

BasicStroke 还可以指定端点的连接样式,斜角,拼接和圆角:

_BEVEL: 用直线连接两条线的外角。

_MITER: 延伸外角直至两线相接。

_ROUND: 半线宽单位的圆形封顶。

图 4 是以上各个选项的效果。

图 4. BasicStroke 的 Cap 和 Join 选项。

下面的例子用BasicStroke生成点线: Stroke stroke = new

BasicStroke(5.0f , // 线

宽 _ROUND, // 端

点 _MITER, // 接

头 15.0f, // 拼接限制 new

float[] {10.0,10.0} // 点线图案 5.0); // 定位 我们再

看一下最后三个属性:

拼接限制可以避免当两条线以JOIN_MITER连接且角度很小的时候,延伸的很夸张。点线

图案是一个浮点数组,第一个是实线的长度,第二个是间断的长度。不断重复描绘实线和间

断实现点线效果。最后的定位设置了位移,即线的起始点。

Font

所有的文本都使用能表现文字的样式图形渲染。当前的字体决定了字体的形状。使用继承自

cs的getFont()方法和setFont()方法来操纵字体。尽管设置字体相对简单的

工作,Java 2D还是为文本描绘提供了丰富的选线。本文的后续版本会深度讨论这个问题。

Transformation

图形在渲染前可能会进行一步或多步的变形。简单而言就是图形可能被移动,旋转或拉伸。

可以通过setTransform()方法设置当前的变

形: nsform(Transform transform); AffineTransform

transform = nsform();Graphics2D类提供许多方便的方法帮助实现变

形。 public void rotate(double theta); public void rotate(double theta, double

aroundPointX, double aroundPointY); public void scale(double scaleX, double

scaleY); public void shear(double shearX, double shearY); public void

translate(double translateX, double translateY); public void transform(AffineTransform

transform);同样,你也可以直接操纵数字矩阵来实现复杂变形。这要比使用基本的变换,旋

转,缩放,倾斜变形等复杂的多。更多关于线性代数的知识超出了本文的讨论范围,在Java

2D API里会对此有说明。一旦你熟悉了这些概念,它们可以有效地帮你实现变形。

Transform类提供了大量的变形控制,可以唯一可实现和上文提到的矩阵能

实现的复杂变形的类。通过AffineTransform类的静态方法可以得到一个AffineTransform

对象,如ateInstance(....),或arInstance(...),

或者不带参的构造函数创建单位变形。 AffineTransform newTransformation = new

AffineTransform();单位变形包含一个单位矩阵,该矩阵保留原始矢量且不可被操作变形。

可以用下面的方法修改变形行为: public void rotate(double theta); public void

rotate(double theta, double aroundPointX, double aroundPointY); public void

scale(double scaleX, double scaleY); public void shear(double shearX, double

shearY); public void translate(double translateX, double translateY);此外,用下面的方

法可以重值单位变形。setToIdentity()方法是个例外,它执行了一个简单变形。 public

void setToIdentity(); public void setToRotation(double theta); public void

setToRotation(double theta, double aroundPointX, double aroundPointY); public void

setToScale(double scaleX, double scaleY); public void setToShear(double shearX,

double shearY); public void setToTranslation(double translateX, double translateY);你

还可以连接或预连接其他AffineTransform类。这样不仅仅是精确控制变形顺序,而是创建

了变形序列(例如变换->旋转->变换->缩放...)。使用下面的方法连接或预连接: public

void concatenate(AffineTransform transform); public void

preConcatenate(AffineTransform transform);

Clipping Space

如果渲染操作在当前的剪辑空间外,则任何像素不会被改变。当前默认的剪辑空间是null,


发布者:admin,转转请注明出处:http://www.yc00.com/news/1710437739a1756698.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信