Rendering:
java2D的呈现主要有三步
1.取得Graphics(Graphics2D)对象
2.设置Griaphics对象的属性
3.通过Graphics对象画图
取得Graphics对象
大多数情况下我们不需要去取得Graphics,一般他都提供给我们了,一般我们使用的就是在paintComponent中
protected void paintComponent(Graphics g)
他直接以参数的方式提供我们了这个对象。
直接传递的对象,设置了属性以后,对象的本质就发生了变化,等方法结束以后,这个对象的属性已经发生了变化,为了防止这种事情的发生,swing提供了取得Graphics的对象的副本的方式,相当于进来以后clone一个对象,等结束以后,clone对象结束,Graphics对象没有发生变化。代码如下:
protected void paintComponent(Graphics g) {
// create a copy
Graphics gTemp = g.create(); -----取得一个副本
// Set the state in gTemp instead
gTemp.translate(x,y);
// ...render the component contents using gTemp...
gTemp.dispose(); --副本结束
}
针对图片呈现
大多数情况下,你需要给图片进行绘画,需要取得Graphics,但是图片是不存在这个对象的,为了提供这个功能,一般我们会采用Image对象进行
Image img = createImage(w, h);
// Get the Graphics object for the image
Graphics g = img.getGraphics();
这样就满足了需要,但是有很多情况下图片是不允许修改的,所以我们无法在上面进行操作,建议使用BufferedImage
注意:我们个人不要调用paint(Graphic g);这个方法留给swing去调用,如果需要调用的话,我们可以去调用repaint()方法,如果直接调用的话,那就直接调用paintImmediately().
Graphic对象可以设置的属性。
fore color,background color,font,storke,hits,clip,compsite,paint,transform
Stroke:线属性控制,主要是重点是否是圆形,宽度等等。
默认情况下swing是一个像素的线,这样效率比较高。
setRenderingHint:
hits是质量和效率的平衡器,是用来权衡质量和效率的。
图片缩放比例的Hits
主要包括三个值,下面逐一介绍
RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR
在放大图像时,图像看起来会相应地有些斑驳模糊。在缩小图像时,在输出表示中,源像素的颜色被不作修改地使用,或者完全被跳过
RenderingHints.VALUE_INTERPOLATION_BILINEAR
当放大图像时,因为有 NEAREST_NEIGHBOR
,在图像中的颜色之间没有斑驳模糊边缘,但是混合可能沿样本排列的水平和垂直边缘显示一些微小的间断,这是由于插值斜面从样本的一侧到另一侧的突然更改造成的。当缩小图像时,更多图像像素具有它们自己的以结果输出表示的颜色样本,因为每个输出像素都从多达 4 个图像像素中接收颜色信息。
RenderingHints.VALUE_INTERPOLATION_BICUBIC
插值提示值—— 使用 X
和 Y
中的立方函数插入图像中整数坐标附近的 9 个样本,以生成一个颜色样本。从概念上讲,图像视图非常类似于 BILINEAR
算法中使用的视图,区别在于连接样本和曲线之间的颜色延伸,且当它们跨越样本边界时具有较好的斜面连续性。
放大图像时,没有斑驳模糊的边缘,与 BILINEAR
相比,插值显示得更光滑且原始图像中的所有边界都具有更好的描绘。当缩小图像时,甚至有更多的原始图像中的原始颜色样本将带有并表示它们的颜色信息。
图形反锯齿
系统默认的是有锯齿的,如果没有锯齿的话,需要去设置hits,具体的参数如下
RenderingHints.VALUE_ANTIALIAS_OFF
缺省值,是有锯齿的
文字反锯齿
RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT
文本抗锯齿提示值——根据 KEY_ANTIALIASING
提示或由实现选择的默认值完成文本呈现。
VALUE_TEXT_ANTIALIAS_OFF
强制管理反锯齿
RenderingHints.VALUE_TEXT_ANTIALIAS_ON
打开反锯齿,平滑过渡
RenderingHints.VALUE_TEXT_ANTIALIAS_GASP
RenderingHints.VALUE_ANTIALIAS_ON