• Java 2D API


     

    Java 2D API扩展AWT包,对二维图形、文本及成像功能提供了支持,可用于开发复杂的界面、绘图软件和图像编辑器。Java 2D对象位于用户坐标空间(User coordinate space),当对象呈现在屏幕或打印机,用户空间坐标转换为设备空间坐标(device space coordinate)。下面两个类对 Java 2D API十分重要:

    • Graphics
    • Graphics2D

     

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

    • 为显示设备和打印机等提供了统一的渲染模型;
    • 提供了大量的几何图元(geometric primitive),如曲线(curves)、方形(rectangle)、椭圆(ellipse),并包含几乎可生成任何几何图形的机制;
    • 图形、文本和图像的hit detection 机制;
    • 用于重叠图像对象渲染的混合模型;
    • 增强颜色支持;
    • 打印复杂的文档;
    • 渲染的质量控制。

     

    1. 坐标系

    Java 2D API 包含两套坐标空间:

    • 用户空间(User space)  - 绘制图形区域坐标系统
    • 设备空间(Device space)  - 输出设备如屏幕、窗口或打印机的坐标系统

     

    用户空间是编程时所使用的坐标空间,该坐标体系是一个与设备无关的逻辑坐标系统。

    用户空间坐标的原点在左上角,x坐标向右递增,y向下递增,如下图所示。所有的坐标以整数指定(大多时候使用整数就足够了,也提供了floatdouble支持)

    clip_image001[4]

     

    设备空间与具体设备相关,虽然屏幕坐标系统和打印机的坐标系统相差很大,但是对Java程序没有任何影响,编程时完全不用考虑。

     

    2.  Java 2D 渲染

    Java 2D API为不同设备提供了统一的渲染模型,不管目标设备是打印机还是屏幕,渲染过程在API层次都是一样的。当需要显示某个组件,其paint() update() 方法都能以配置合适的Graphics 调用。

     

    Graphics属性:

    • Color: 当前绘制颜色(java.awt.Color)。所有的绘制,着色和纯文本输出都将以指定的颜色显示;
    • Font:当前字体(java.awt.Font)。用于所有纯文本输出的字体。
    • Clipjava.awt.Shape类型,用于定义几何形状。该特性定义进行绘制的区域。通常这一形状与整个图形环境相同,但也不一定如此。
    • ClipBoundsjava.awt.Rectangle对象,表示包围Clip属性所需的Shape类型的最小矩形。只读属性。
    • FontMetricsjava.awt.FontMetrics只读特性。该对象包含关于图形环境中当前起作用的Font的信息。获取该信息的机制被LineMetrics类取代。
    • Paint Mode:该特性控制环境使用当前颜色的方式。

     

    Graphics2D类扩展Graphics类,提供了更多的图形绘制功能。包括:

    • stroke paint属性(draw方法),用于渲染几何图元的边框;
    • paint 属性 (fill方法),使用特定颜色或图案填充图形;
    • font 属性,(drawString方法)渲染文本,通过font属性将字符串转换为字形(glyph),然后通过paint属性填充颜色或图形;
    • 渲染图像(drawImage方法)

    另外,Graphics2D还包含Graphics的方法,如drawOval, fillRect

     

    以上所有方法可以分为两类:

    1. 绘制图形的方法
    2. 渲染图形的方法

     

    第二类方法通过设置 Graphics2D 的属性值实现以下渲染功能:

    • 改变笔画宽度
    • 改变笔画之间的连接方式
    • 指定需要渲染的区域
    • 对图形进行平移、旋转、缩放等
    • 设置图形填充的颜色和图案
    • 设置多个图形组合的方式

     

    要使用Graphics2D的功能,需要对 Graphics 进行强制转换:

    publicvoid paint(Graphics g){

    Graphics2D g2 = (Graphics2D) g;

    ……

    }

     

    下面以具体图形展示 Graphics2D 的不同特性:

    clip_image002[4]

    pen属性,应用于图形边框。该stroke属性允许以任意的点尺寸(point size)、虚线模式(dashing pattern) 、末端链接方式绘制线条。

    clip_image003[4]

    fill属性,用于图形内部。该paint属性支持以纯色、渐变色或图纹等不同方式填充图形。

    clip_image004[4]

    compositing属性,用于重合对象的渲染、

    clip_image005[4]

    transform属性,将渲染对象从用户空间转换为设备空间时应用的属性。包括平移、渲染、缩放等。

    clip_image006[4]

    clip属性,通过Shape对象指定需要渲染区域的。

    clip_image007[4]

    font属性,将文本转换为字形(glyphs)

    clip_image008[4]

    渲染建议(Rendering hints),在渲染的速度和质量间进行取舍。例如,你可以指定是否使用反锯齿(antialiasing)

     

    3. 几何图形

    Java 2D API提供了点、线、矩形、弧线、椭圆、曲线等一套标准的几何图形。这些基本图形都定义在 java.awt.gemo包中。任何其他的形状都可以通过这些基本图形进行组合获得。

     

    Shape 接口表示一个几何图形,包含边框和内部区域。该接口定义的方法功能包括:描述和检查二维几何对象,支持曲线片段和图形子片段,而Graphics类只支持直线片段。

     

    下面是对java.awt.geom 包中各个类的简介。

    (AffineTransform, Arc2D, Area, CubicCurve, Dimension2D, Ellipse2D, FlatteningPathIterator, GeneralPath, Line2D, Path2D, QuadCurve, Rectangle2D, RectangularShape, RoundRectangle2D)

    clip_image009[4]

     

    黄色部分是遗留类。

     

    3.1 Points

    Point2D 类定义了一个 (x,y) 坐标空间的点。在Java 2D API "point"不等价于 pixel"point" 没有面积,不包含颜色,并且不能被渲染。

    Points 用于创建其他的图形。 Point2D中包含一个计算两点之间距离的方法。

     

    3.2 Lines

    Line2D 是用于表示“线”的抽象类。线的坐标可以用 double 表示。Line2D类包含多个用于设置“线”终点的方法。也可以使用GeneralPath 类创建直线。

     

    3.3 Rectangular Shapes

    Rectangle2D, RoundRectangle2D, Arc2DEllipse2D 图元都扩展自 RectangularShape 类,该类实现了Shape接口。

    clip_image010[4]

     

    3.4 Quadratic and Cubic Curves (二次和三次曲线)

    QuadCurve2D 用于创建二次曲线。二次曲线通过两个端点和一个控制点定义。

    CubicCurve2D 类用于创建三次曲线。三次曲线通过两个端点和两个控制点定义。

    二次曲线

    clip_image011[4]

    三次曲线

    clip_image012[4]

     

    3.5 Arbitrary Shapes

    GeneralPath类可用于创建任意形状。该类通过指定图形的边框创建任意形状。如,下图用三条直线和一条三次曲线创建曲线:

    clip_image013[4]

     

    3.6 Areas

    通过Area类,可以对两个Shape 对象执行布尔操作,如(合并、交叉、相减)。该技术,也被称为区域几何学(Constructive area geometry),可用来迅速创建复杂的图形。

     

    4. 文本(Text)

    Java 2D API包含许多文本渲染功能,如字符串渲染,字体设置以及文本布局。

    绘制静态字符串方法:调用Graphics 类的 drawString方法。通过Graphics setFont方法指定字体。

     

    如果你需要实现自己的文本编辑程序,或需要更好的控制文本的布局,则可以使用 java.awt.font包中的类。

     

    4.1 字体(Fonts)

    字体中字符的形状的表示称为字形(glyph)。单个字符或多个字符可能以一个或多个glyph表示。例如, á可能以两个glyph表示,而连字fi则可能以一个glyph表示。

     

    可以将字体(font)看做是一个glyph集合。一个字体可以包含多个属性(faces),如斜体(italic)、常规(regular)和加粗等,单个字体的不同faces具有类似的排版特性,因此可以看做是同一字体的成员。换句话说,特定风格的字形(glyph)集合构成一个font facefont face集合构成一个font familyfont family集合构成一个计算机上可用的所有字体。

     

    Java 2D API通过Font实例指定字体。通过如下方法可以获得当前系统所有可用字体:

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

    String[] fonts = ge.getAvailableFontFamilyNames();

    for (String s : fonts) {

    System.out.println(s);

    }

     

    4.2 文本布局(Text Layout)

    在显示文本前,必须对其进行排版,以合适的字形显示对应的字符。下面是Java 2D 管理文本布局的两种机制:

    • TextLayout管理文本布局(text layout),文本高亮(highlighting)hit detectionTextLayout可用于处理大部分情况,包括混合字体文本、混合语言和双向文本等。
    • 可以用于Font类创建自己的GlyphVector对象,然后使用Graphics2D类渲染GlyphVector。如此能够完全控制文本的形状和位置。

     

    4.3 文本的渲染建议(Rendering Hints for Text)

    Java 2D API 通过rendering hints控制图形和文本渲染的质量。Rendering hints封装在java.awt.RenderingHints类中。

    对文本来说,该功能指反锯齿(也称为平滑边角)。例如,KEY_TEXT_ANTIALIASING可单独用于文本的平滑处理。

     

    5. 图像(Images)

    Java2D API中,一张图片就是一个矩形的像素二维数组,每个像素(pixel)表示特定位置的颜色,而维度表示图片的宽度和高度。

     java.awt.image.BufferedImage是表示图片最重要的类。Java2D API 通过BufferedImage表示图片将其载入内存,从而可以直接访问。

    可直接创建BufferedImage,也可以通过载入外部图片(PNGGIF)创建BufferedImage

    不管是哪种方式,Java2D API都允许在图片上进行绘制。所以,图形不局限于摄影类型图片,也包含弧线、文本甚至其他的图片,都可以绘制在一张图片上,如下所示:

    clip_image014[4]

     

    Java 2D API允许对BufferedImage进行过滤,并且内置了许多过滤器。例如,ConsolveOp 过滤器可用于模糊(blur)或锐化(sharpen) 图片。处理后的图片可以输出到屏幕上,打印出来或者输出为PNGGIF等格式进行保存。

     

    6. 打印(Printing)

    所有的Swing Java 2D 图像(graphics), 包括复合(composited)图形图像,都可以通过Java2D Printing API到处到打印机。该API 还提供了组成文本的功能,从而可以对打印进行控制,如改变页面打印顺序等。

    输出到打印机和输出到屏幕类似:打印系统控制页面何时打印,绘制系统控制一个组件何时在屏幕显示。

     

    Java 2D Printing API 的打印系统使用callback模型控制页面的打印。通过应用程序提供待打印文本,打印系统控制何时对页面进行打印。

     

    下面的两个特性对支持打印十分重要:

    • 任务控制(Job control) - 用于发起和控制打印任务,包括显示标准打印和设置对话框。
    • 页码导航(Pagination) - 在打印系统发出请求时,渲染每个页面。

     

    当需要将页面图像化,打印系统以特定配置的Graphics调用应用的 print 方法。要使用Java 2D API特性,需要将Graphics 转换为Graphics2D,和绘图时一样。

  • 相关阅读:
    9种纯CSS3人物信息卡片动态展示效果
    CSS3 animation属性 实现转动效果
    炫酷CSS3垂直时间轴特效
    css实现翻面效果
    uniapp上传图片转base64码
    经常使用的js三元表达式
    async/await 使用
    Python的OS模块批量修改文件名
    解决Tomcat对POST请求文件上传大小的限制
    HTTP 413错误解决方法
  • 原文地址:https://www.cnblogs.com/jiawei-whu/p/5568231.html
Copyright © 2020-2023  润新知