Java标准教程:Java 2D绘图--第1章 Java 2d API概念概述

Java 2D API 通过扩展抽象窗口工具箱(AWT ),为Java 程序提供了二维图像,文本和图形的功能。这个复杂的渲染包支持线形图像,文本和图形,为富用户界面,复杂绘图程序和图像处理器开发者提供灵活的,功能强大的框架。Java 2D 对象出现在一个平面中,称为用户坐标系空间,和设备坐标系空间。当对象在屏幕或打印机中渲染时,用户空间坐标系被转换成设备空间坐标系。以下链接可以在开始学习Java 2D API 时是很有用的:

l         Graphics

l         Graphics2D

Java 2D API 提供了以下功能:

l         为设备和打印机展示统一的渲染模型。

l         大量基本集合图形,例如曲线,矩形,椭圆,以及渲染任何集合图形的渲染技术。

l         在图形,文本和图像中执行撞击检测。

l         一个复杂的模型,提供了控制如何渲染重叠对象。

l         增强型的颜色支持。

l         使用渲染提示控制渲染的质量。

这些主题在以下章节中进行介绍:

l         Java 2D 渲染

l         基本集合图形

l         文本

l         图像

l         打印

 

1.1 坐标系

Java 2D API 维护两个坐标系空间。

l         用户空间:指定基本图形的空间。

l         输出设备的坐标系,例如屏幕,窗口或打印机。

用户空间是独立于设备的逻辑坐标系,坐标系空间是您的应用程序使用的。所有传递到Java 2D 渲染流程中的几何图形都使用用户空间坐标系指定。

当使用从用户空间到设备空间的转换时,原有的用户空间是组件绘制空间的左上角。X 轴向右增加,y 轴向下增加,和下图中展示的一致。窗体的左上角时(0, 0) 。所有的坐标系都是用整数表示,通常是足够的。然而一些情况下需要浮点甚至double 精度的坐标,也是支持的。

 

 

1.2 Java 2D 渲染

Java 2D API 为不同类型的设备提供了统一的渲染模型。在应用程序级别,不管设备是屏幕还是打印机,渲染流程是一样的。当组件需要展示时,它的paintupdate 方法会在合适的Graphics 是上下文中被自动调用。

Java 2D API 中包含java.awt.Graphics2D 类,它扩展了Graphics 类,同时为Java 2D API 提供了增强型的图形和渲染特斯那个。这些特性包括:

l         渲染任意几何形状的轮廓,使用strokepaint 属性。

l         使用指定的颜色或paint 属性指定的模式渲染任意几何图形。

l         渲染任意文本字符串(使用drawString 方法)。Font 属性用来将字符串转换成集合图形,然后使用paint 属性渲染它。

l         渲染特定图形(drawImage 方法)。

同时,Graphics2D 类支持特定形状的渲染,例如drawOvalfillRect 。所有上述的方法可以分成以下两组:

l         绘制形状的方法。

l         影响渲染的方法。

第二组方法使用构成Graphics2D state 属性完成如下目的:

l         改变笔画宽度

l         改变多少笔画组合到一起。

l         设置剪切路径限制渲染的区域。

l         在对象渲染时进行转换,旋转,拉伸和剪切。

l         定义填充图形的颜色和模式

l         指定如何组合复杂的图形对象。

要在应用程序中使用Java 2D API ,需要将传递到组件渲染方法的Graphics 转换成Graphics2D 对象,例如:

 

public void paint (Graphics g) {

    Graphics2D g2 = (Graphics2D) g;

    ...

}

 

正如下面的图形所示,Graphics2D 渲染上下文包含以下属性:

 

 

Pen 属性应用于形状的外边框。Stroke 属性让您可以使用任何点大小和模式划线。

 

 

 

Fill 属性作用于图形的内部。这个绘图属性让您可以使用实心颜色,渐变色和其他模式填充图形。

 

 

Compositing 在渲染对象重叠时起作用。

 

 

Transform 属性在将被渲染对象从用户空间转换到设备空间坐标系时使用。可选的有变换,旋转,拉伸或剪切,他们可以通过这些属性生效。

 

 

Clip 限制渲染的区域在Shape 对象的范围之内定义的剪切路径。任何Shape 对象都可以定义剪切。

 

 

Font 属性将文本字符串转换成图形。

 

 

渲染提示指定在速度和质量之间权衡后的优先级。例如,您可以指定是否使用抗锯齿。

要了解有关转换和组合的更多支持,请参考Java 2D 教程的高级章节。

当设置属性时,需要传递属性对象。正如以下例子所示,要修改paint 属性为蓝绿色渐变渲染,您需要创建GradientPaint 对象,然后调用setPaint 方法。

 

gp = new GradientPaint(0f,0f,blue,0f,30f,green);

g2.setPaint(gp);

 

1.3 基本几何图形

Java 2D API 提供了标准图形的完整集合,例如点,线,矩形,弧形,椭圆和曲线。定义这些通用集合图形的包是java.awt.geom 。任何形状都可以通过组合这些基本几何图形得到。

Shape 接口表示集合形状的轮廓和内部。这些接口提供了描述和合并二维集合对象的方法,同时支持弧线片段和多个子形状。Graphics 类只支持直接的线片段。Shape 接口可以支持弧线片段。

要了解绘制和填充图形的更多支持,请参考几何图形一节。

 

1.3.1

Point2D 类定义了坐标系空间的位置(x, y)Java 2D API 中的术语“点”和像素是不同的。点没有区域,没有颜色,也不能被渲染。

点用来创建其他形状。Point2D 类包含计算两点距离的方法。

 

1.3.2 线

Line2D 类是表示线的抽象类。线的坐标可以作为double 类型取得。Line2D 类中提供一些设置线终点的方法。

同时,您可以使用GeneralPath 类创建一个直线片段。

 

1.3.3 常用形状

Rectangle2D, RoundRectangle2D, Arc2D, Ellipse2D 基本类型都从RectangularShape 类派生。这个类定义了Shape 对象的方法,可以作为常用的圆盒子。RectangularShape 对象的集合形状可以通过在矩形外面包含shape 的方式得到。

 

 

 

1.3.4 二次和三次曲线

QuadCurve2D 可以让你创建二次参数的曲线片段。二次曲线通过定义两个端点核控制点组成。

CubicCurve2D 可以让你创建三次参数的曲线片段。三次曲线通过两个端点核两个控制点定义。一下例子是二次和三次曲线。二次和三次曲线的实现请参考笔画和填充章节。

下图表示了二次曲线。

 

 

下图表示三次曲线:

 

 

 

1.3.5 任意形状

您可以使用GeneralPath 类,通过制定一些列Shape 的边界点的方式制定任意形状。这些位置可以使用线片段,二次曲线或三次曲线连接。一下行装可以使用三段直线和一段三次曲线组成。这个形状的实现请参考笔画和填充一节。

 

1.3.6 区域

使用Area 类,您可以在两个Shape 对象中执行boolean 操作,例如并集,交集和差集。这项技术,通常作为区域几何图形,您可以更快的创建复杂的Shape 对象,而不需要描述每一个线片段或曲线。

 

1.4 文本

Java 2D API 有很多文本渲染功能,包括渲染字符串的方法,以及设置字体属性的方法和执行文本布局的方法。

如果您只想要绘制静态的字符串,最直接的方式是使用Graphics 类的drawString 方法。要制定字体,您可以使用Graphics 类的setFont 方法。

如果您想实现自己的文本编辑例程或需要在text 组建提供功能之外控制文本的布局,您可以使用java.awt.font 包中的Java 2D 文本布局类。

 

1.4.1 字体

字体用来表示字符串中字符的形状成为字形。一种特定的字符或几种字符的组合可以表示一个或多个字形。例如,á 可以表示两个字形,但音符fi 可能通过一个字形表示。

字体可以被当做一组字形的集合。单一字体可以有多种表示,例如斜体和常规。字体的所有的表示都有相同的印刷特性,可以被当做相同家族的成员。换句话说,有特定风格的一组字形组成了字体的外观。一组字体外观的集合组成了字体家族。字体家族的集合组成了系统中可得到的字体。

当使用Java 2D API 时,您使用font 的实例指定字体。您可以通过调用静态方法GraphicsEnvironment.getLocalGraphicsEnvironment 得到支持哪些字体。getAllFonts 方法返回系统中包含的所有字体的数组。getAvailableFontFamilyNames 方法返回可用的字体家族的名称。

 

1.4.2 文本布局

在现实文本之前,必须被布局,将表示合适字形的字体放置在合适的位置。以下是Java 2D 中管理文本布局的两个机制:

l         TextLayout 类管理文本布局,高亮和撞击测试。TextLayout 提供的功能可以满足大多数使用,包括混合字体,混合语言和双向字体。

l         您可以使用Font 类创建自己的GlyphVector 对象,然后通过Graphics2D 类渲染每个GlyphVector 对象。这样,您可以完全控制文本的形状和位置。

 

1.4.3 文本的渲染提示

Java 2D API 让您使用渲染提示管理Shape 和文本渲染。渲染提示被封装在java.awt.RenderingHints 类中。

作用到文本上时,这项功能通常用来进行抗锯齿(圆滑边缘)。例如,KEY_TEXT_ANTIALIASING 提示让您可以单独控制文本的抗锯齿特性。更多信息请参考控制渲染质量一节。

 

1.5 图像

Java 2D API 中,图像时一个常规的二维数组,每个点表示图像的位置,同时维度表示图像的水平(宽)和垂直(高)。

表示这种图像的最重要的类是java.awt.image.BufferedImage 类。Java 2D API 在内存中保存这种图像的内容,这样他们可以被直接访问。

应用程序可以直接创建BufferedImage 对象,或从外部图像例如PNGGIF 中获取图像。

两种情况下,应用程序可以使用Java 2D API 画图。所以,图像不仅限于展示照片类型的图像。不同的对象,例如艺术线条,文本和其他图像以及图片可以在图像中绘制。

 

 

 

Java 2D API 可以让您为BufferedImage 应用过滤操作,同时包含很多内建的过滤器。例如,ConvolveOp 可以用来模糊或突出图像。

最终的图像可以画到屏幕中,发送到打印机中,或以PNGGIF 格式保存起来。更多信息请参考图像一节。

 

1.6 打印

所有的SwingJava 2D 图像,包括组合的图形和图片,都可以使用Java 2D 打印API 渲染到打印机中。这些API 同事提供了文本组合功能,可以让你执行诸如修改打印方向的操作。

渲染到打印机中和渲染到屏幕中一样。打印系统控制页面渲染的时机,和绘图系统控制组件什么时候绘制到屏幕中一样。

Java 2D 打印API 给予打印系统的回调函数,而不是应用程序的,它控制什么时候进行打印。提供打印系统的应用程序有文档打印的信息,同事打印系统决定每一页需要被绘制的时机。

以下两个特性对支持打印很重要:

l         任务控制:初始化和管理打印任务包括展示标准打印和配置对话框。

l         页码:打印系统请求时返回每一页

打印系统在合适应用程序Graphics 上下文中的调用应用程序的打印方法。要在打印时使用Java 2D API 特性,您需要将Graphics 对象转换成Graphics2D 对象,和在屏幕中渲染一样。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值