Graphics2D使用详解.docx

上传人:b****3 文档编号:3062436 上传时间:2022-11-17 格式:DOCX 页数:20 大小:53.25KB
下载 相关 举报
Graphics2D使用详解.docx_第1页
第1页 / 共20页
Graphics2D使用详解.docx_第2页
第2页 / 共20页
Graphics2D使用详解.docx_第3页
第3页 / 共20页
Graphics2D使用详解.docx_第4页
第4页 / 共20页
Graphics2D使用详解.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

Graphics2D使用详解.docx

《Graphics2D使用详解.docx》由会员分享,可在线阅读,更多相关《Graphics2D使用详解.docx(20页珍藏版)》请在冰豆网上搜索。

Graphics2D使用详解.docx

Graphics2D使用详解

Graphics2D使用详解【转】

2007-08-2411:

30

Java2D-HowtheGraphics2DClassRenders

正如我们在前面提到的,我们可以对Graphics2D类进行多项设置。

实际上,渲染引擎在绘制Graphics2D图形前会查看7个主要的属性:

Paint

Stroke

Font

Transformation

Clippingspace

Renderinghints

Compositingrule

让我们逐一讲解:

Paint

新的paint可以同时作用在边线和填充上了。

Graphics2D类可以用setPaint()和getPaint()方法配制paint属性:

     g2.setPaint(java.awt.Paintpaint);

     Paintpaint=g2.getPaint();

paint可以是单色,渐变和图案。

任何paint都需要实现java.awt.Paint接口。

Java2D类库中有三个类你应该感到熟悉:

java.awt.Color:

Java2D使用同样的常量。

因为Color类实现了java.awt.Paint接口,所有的Color对象都是Paint对象。

java.awt.GradientPaint:

这个类用颜色渐变填充一个区域。

构造函数制定比例和颜色。

图形引擎会从第一个点到第二个点之间线性变化两个颜色。

我们还可以指定颜色图案是否允许重复。

java.awt.TexturePaint:

这个类平铺一个图像来填充图形。

构造函数接收一个java.awt.image.BufferedImage和一个Rectangle2D,把图像影射到矩形里,然后平铺矩形。

图3显示java.awt.GradientPaint和java.awt.TexturePaint的实例。

图3.GradientPaint和TexturePaint

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

在BufferedImage的构造函数里制定长,宽,高,类型为BufferedImage.TYPE_INT_RGB,然后调用createGraphics()方法得到一个Graphics2D。

如果要用图片的话就需要更多的步骤。

首先,从一个图片文件里读入Image对象,用MediaTracker保证图片完全读入,然后建立和Image对象等宽高的空BufferedImage对象。

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

Stroke

描边决定着图形或文字的轮廓。

通过setStroke()方法定义描边:

:

     g2.setStroke(java.awt.Strokestroke);

     java.awt.Strokestroke=g2.getStroke();

在Java2D出现以前,java.awt.Graphics的描绘方法产生一个1像素宽的实线边。

Java2DAPI给你更灵活的描边选择。

边缘即可以是粗细不等的实线,也可以是等宽点线。

setStroke()方法的参数必须实现java.awt.Stroke接口。

现在java.awt.BasicStroke类是唯一实现的类。

下面是BasicStroke的构造函数:

BasicStroke():

这个构造建立一个1单位宽的描边。

端点样式是默认的CAP_SQUARE,默认接头样式是默认的JOIN_MITER。

BasicStroke(floatpenWidth):

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

BasicStroke(floatpenWidth,intcapStyle,intjoinStyle):

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

BasicStroke(floatpenWidth,intcapStyle,intjoinStyle,floatmiterLimit):

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

BasicStroke(floatpenWidth,intcapStyle,intjoinStyle,floatmiterLimit,

float[]dashPattern,floatdashOffset):

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

offset是点线的起始位置,一般是0,0。

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

型如下:

java.awt.BasicStroke.CAP_BUTT:

端点直接切断。

java.awt.BasicStroke.CAP_ROUND:

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

java.awt.BasicStroke.CAP_SQUARE:

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

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

java.awt.BasicStroke.JOIN_BEVEL:

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

java.awt.BasicStroke.JOIN_MITER:

延伸外角直至两线相接。

java.awt.BasicStroke.JOIN_ROUND:

半线宽单位的圆形封顶。

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

图4.BasicStroke的Cap和Join选项。

下面的例子用BasicStroke生成点线:

Strokestroke=newBasicStroke(5.0f,                  //线宽

                                BasicStroke.CAP_ROUND,  //端点

                                BasicStroke.JOIN_MITER,//接头

                                15.0f,                  //拼接限制

                                newfloat[]{10.0,10.0}//点线图案

                                5.0);                   //定位

我们再看一下最后三个属性:

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

点线图案是一个浮点数组,第一个是实线的长度,第二个是间断的长度。

不断重复描绘实线和间断实现点线效果。

最后的定位设置了位移,即线的起始点。

Font

所有的文本都使用能表现文字的样式图形渲染。

当前的字体决定了字体的形状。

使用继承自java.awt.Graphics的getFont()方法和setFont()方法来操纵字体。

尽管设置字体相对简单的工作,Java2D还是为文本描绘提供了丰富的选线。

本文的后续版本会深度讨论这个问题。

Transformation

图形在渲染前可能会进行一步或多步的变形。

简单而言就是图形可能被移动,旋转或拉伸。

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

    g2.setTransform(java.awt.geom.AffineTransformtransform);

    AffineTransformtransform=g2.getTransform();

Graphics2D类提供许多方便的方法帮助实现变形。

    publicvoidrotate(doubletheta);

    publicvoidrotate(doubletheta,doublearoundPointX,doublearoundPointY);

    publicvoidscale(doublescaleX,doublescaleY);

    publicvoidshear(doubleshearX,doubleshearY);

    publicvoidtranslate(doubletranslateX,doubletranslateY);

    publicvoidtransform(AffineTransformtransform);

同样,你也可以直接操纵数字矩阵来实现复杂变形。

这要比使用基本的变换,旋转,缩放,倾斜变形等复杂的多。

更多关于线性代数的知识超出了本文的讨论范围,在Java2DAPI里会对此有说明。

一旦你熟悉了这些概念,它们可以有效地帮你实现变形。

java.awt.AffineTransform类提供了大量的变形控制,可以唯一可实现和上文提到的矩阵能实现的复杂变形的类。

通过AffineTransform类的静态方法可以得到一个AffineTransform对象,如AffineTransform.getRotateInstance(....),或AffineTransform.getShearInstance(...),或者不带参的构造函数创建单位变形。

  AffineTransformnewTransformation=newAffineTransform();

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

可以用下面的方法修改变形行为:

    publicvoidrotate(doubletheta);

    publicvoidrotate(doubletheta,doublearoundPointX,doublearoundPointY);

    publicvoidscale(doublescaleX,doublescaleY);

    publicvoidshear(doubleshearX,doubleshearY);

    publicvoidtranslate(doubletranslateX,doubletranslateY);

此外,用下面的方法可以重值单位变形。

setToIdentity()方法是个例外,它执行了一个简单变形。

    publicvoidsetToIdentity();    

    publicvoidsetToRotation(doubletheta);

    publicvoidsetToRotation(doubletheta,doublearoundPointX,doublearoundPointY);

    publicvoidsetToScale(doublescaleX,doublescaleY);

    publicvoidsetToShear(doubleshearX,doubleshearY);

    publicvoidsetToTranslation(doubletranslateX,doubletranslateY);

你还可以连接或预连接其他AffineTransform类。

这样不仅仅是精确控制变形顺序,而是创建了变形序列(例如变换->旋转->变换->缩放...)。

使用下面的方法连接或预连接:

    publicvoidconcaten

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1