Java Graphics2D类的绘图方法
Graphics2D继承自Graphics,它扩展了Graphics的绘图功能,拥有更强大的二维图形处理能力,提供对几何形状、坐标转换、颜色管理以及文字布局等更精确的控制。
Graphics2D定义了几种方法,用于添加或改变图形的状态属性。可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式,设定平移、旋转、缩放或修剪变换图形,以及设定填充图形的颜色和图案等。
图形状态属性用特定的对象存储。
常用绘图属性
stroke属性
我们可以调用调用如下方法来设置stroke属性:
public abstract void setStroke(Stroke s)
stroke属性用于控制线条的宽度、笔形样式、线段连接方式或短划线图案。
如果我们要设置stroke属性,则应当先创建Stroke引用的对象,但由于Stroke为接口类型,所以我们要创建对象,可以创建其已知实现类BasicStroke的对象。
BasicStroke常用的构造方法有:
// 构造一个具有指定属性的实心的 BasicStroke
public BasicStroke(float width, int cap, int join)
// 构造一个具有指定线条宽度以及 cap 和 join 风格为默认值的实心 BasicStroke
public BasicStroke(float width)
cap是端点样式,可取值为:CAP_BUTT(无修饰),CAP_ROUND(半径等于画笔宽度一半的圆形装饰末端),CAP_SQUARE(正方形末端,默认值)。
join是用于定义两线段交汇处的连接方式:JOIN_BEVEL(无修饰),JOIN_MITER(尖形末端,默认值),JOIN_ROUND(圆形末端)。
clip属性
clip属性用于实现剪裁效果。设置剪裁属性可调用如下方法确定剪裁区的Shape:
public abstract void setClip(int x, int y, int width, int height)
连续多个setClip()得到它们交集的剪裁区。
paint属性
paint属性控制填充效果,通过调用setPaint()方法设置:
public abstract void setPaint(Paint paint)
paint可以同时作用在边线和填充上,可以是单色,渐变和图案,任何paint都需要实现java.awt.Paint接口。因为Color类实现了java.awt.Paint接口,所有的Color对象都是Paint对象。
GradientPaint类:
public GradientPaint(float x1, float y1, Color color1,
float x2, float y2, Color color2)
这个类用颜色渐变填充一个区域,构造函数指定定比例和颜色。图形引擎会从第一个点到第二个点之间线性变化两个颜色:从(x1,y1)到(x2,y2)颜色从c1渐变到c2。我们还可以指定颜色图案是否允许重复。
TexturePaint类:
public TexturePaint(BufferedImage txtr, Rectangle2D anchor)
这个类平铺一个图像来填充图形,构造函数接收一个java.awt.image.BufferedImage和一个Rectangle2D,把图像影射到矩形里,然后平铺矩形。
我们可以先创建GradientPaint类或TexturePaint类的对象,再调用Graphics2D的setPaint()方法设置填充效果。
Font属性
所有的文本都使用能表现文字的样式图形渲染。当前的字体决定了字体的形状。使用继承自java.awt.Graphics的getFont()方法和setFont()方法来操纵字体。尽管设置字体相对简单的工作,Java 2D还是为文本描绘提供了丰富的选项。
Transform属性
transform属性用来实现常用的图形平移、缩放和斜切等变换操作。我们可以调用setTransform()来设置transform属性:
public abstract void setTransform(AffineTransform Tx)
该方法需要一个AffineTransform对象的参数,所以首先创建AffineTransform对象,然后调用setTransform()方法设置transform属性。最后,用具有指定属性的Graphics2D对象绘制图形。
创建AffineTransform对象的方法有:
// 旋转变换,旋转theta弧度
public static AffineTransform getRotateInstance(double theta)
// 绕旋转中心(anchorx, anchory)旋转
public static AffineTransform getRotateInstance(double theta, double anchorx,
double anchory)
// 缩放变换,x和y方向分别按sx,sy比例变换
public static AffineTransform getScaleInstance(double sx, double sy)
// 错切变换,shx和shy指定斜拉度
public static AffineTransform getShearInstance(double shx, double shy)
// 平移变换,tx和ty表示x和y方向平移距离
public static AffineTransform getTranslateInstance(double tx, double ty)
当然,也可以先创建一个没有transform属性的AffineTransform对象,然后用以下方法指定图形平移、旋转、缩放变换属性:
// 将图形在x轴方向平移tx像素,y轴方向平移ty像素
public void translate(double tx, double ty)
// 旋转theta弧度
public void rotate(double theta)
// 图形以点(anchorx, anchory)为轴点,旋转theta弧度
public void rotate(double theta, double anchorx, double anchory)
// 图形在x轴方向缩放sx倍,纵向缩放sy倍
public void scale(double sx, double sy)
composit属性
composit属性设置图形重叠区域的效果。可通过调用setComposite()方法设置该属性:
public abstract void setComposite(Composite comp)
例如先用方法AlphaComposite.getInstance(int rule, float alpha)得到AlphaComposite对象,再通过setComposite()方法设置混合效果。AlphaComposite在图形和图像中实现混合和透明效果,Alpha值的范围为0.0f(完全透明)-1.0f(完全不透明)。
使用Graphics2D绘图
Graphics2D类仍然保留Graphics类的绘图方法,同时增加了许多新方法。新方法将几何图形(线段、圆等)作为一个对象来绘制。在java.awt.geom包中声明的一系列类,分别用于创建各种身体图形对象。常用的主要有:
?Line2D - 线段类
?RoundRectangle2D - 圆角矩形类
?Ellipse2D - 椭圆类
?Arc2D - 圆弧类
?QuadCurve2D - 二次曲线类
?CubicCurve2D - 三次曲线类。
要用Graphics2D类的新方法画一个图形。先在重画方法paintComponent()或paint()中,把参数对象g强制转换成Graphics2D对象;然后,用上述图形类提供的静态内部类构造方法Double()或Float()创建该图形的对象;最后,以图形对象为参数调用Graphics2D对象的draw()方法绘制这个图形。
画一条线段:
/* 画线 */
Stroke s = new BasicStroke(20, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
g2d.setStroke(s);
Line2D line = new Line2D.Double(30,50,100,200);
g2d.draw(line);
画一个圆角矩形:
/* 画圆角矩形 */
g2d.setColor(Color.BLUE);
RoundRectangle2D rect = new RoundRectangle2D.Double(100, 50, 100, 50,
4, 4);
g2d.draw(rect);
画一个旋转一定角度的矩形:
/* 画旋转一定角度的矩形 */
Rectangle2D rect2 = new Rectangle2D.Double(60, 160, 60, 90);
AffineTransform transform = new AffineTransform();
transform.rotate(45 * Math.PI / 180, 90, 200); // 围绕(90,200)点旋转图形45度
g2d.setTransform(transform);
g2d.draw(rect2);
Java Graphics2D类的绘图方法的更多相关文章
- Java知多少(99)Graphics2D类的绘图方法
Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的 ...
- 十一. 图形、图像与多媒体5.Graphics2D类的绘图方法
Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的 ...
- Java-Graphics类的绘图方法实现
Java-Graphics(画图类) 就比如画一个矩形,你给出矩形左上角坐标,再给出矩形长度和宽度就可以在JFrame上画出来一个矩形 除了矩形之外,还可以画椭圆.圆.圆弧.线段.多边形.图像等 下面 ...
- Java AtomicInteger类的使用方法详解_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Samp ...
- 第4篇-JVM终于开始调用Java主类的main()方法啦
在前一篇 第3篇-CallStub新栈帧的创建 中我们介绍了generate_call_stub()函数的部分实现,完成了向CallStub栈帧中压入参数的操作,此时的状态如下图所示. 继续看gene ...
- 第29篇-调用Java主类的main()方法
在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责 ...
- Java知多少(98)Graphics类的绘图方法
Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力.本节讲解Graphics类,下节讲解Graphics2D. Graphics类提供基本的几何图形绘制方法,主要有:画线段 ...
- 十一. 图形、图像与多媒体4.Graphics类的绘图方法
Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力.本节讲解Graphics类,下节讲解Graphics2D. Graphics类提供基本的几何图形绘制方法,主要有:画线段 ...
- JavaGraphics类的绘图方法
Graphics类提供基本绘图方法,Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形.画字符串等. 1. 画线段:在窗口中画一条线段 ...
随机推荐
- Tomcat8.0 JDK1.8 的详细配置 Win10
官网下载 先安装JDK以及JRE 之后安装Tomcat jdk配置环境变量: 用户变量:path:C:\Program Files\Java\jdk1.8.0_161\bin ( jdk安装的 ...
- Python之条件判断
Python之条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age = 20 if age ...
- stark组件之处理函数动态url构造(五)
在这个组件中有内置的4个处理函数,它们都有自己对应的url,那么它们的url是怎么构造的呢? ... urlpatterns = [ re_path('list/$', self.wrapper(se ...
- python Django 相关学习笔记
Django框架 pip3 install django 命令: # 创建Django程序 django-admin startproject mysite # 进入程序目录 cd mysite # ...
- 转载:Django之Form组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 +? 1 2 3 ...
- Leetcode 211.添加与搜索单词
添加与搜索单词 设计一个支持以下两种操作的数据结构: void addWord(word) bool search(word) search(word) 可以搜索文字或正则表达式字符串,字符串只包含字 ...
- 【判断二分图】C. Catch
https://www.bnuoj.com/v3/contest_show.php?cid=9154#problem/C [题意] 给定一个无向图,给定小偷的起始位置 从这个起始位置开始,小偷可以在单 ...
- 【bzoj1965】[Ahoi2005]SHUFFLE 洗牌 - 快速幂
为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行 ...
- 仪仗队(bzoj 2190)
Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...
- Linux下汇编语言学习笔记26 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...