11图形图像以及动画.docx
- 文档编号:10876968
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:21
- 大小:28.83KB
11图形图像以及动画.docx
《11图形图像以及动画.docx》由会员分享,可在线阅读,更多相关《11图形图像以及动画.docx(21页珍藏版)》请在冰豆网上搜索。
11图形图像以及动画
第十二章图形和图像以及动画
1、图形
2、图像
3、动画
4、Java的声音功能(可选项)
一、图形
1、Java的图形坐标系统
Java的坐标使用像素来作为度量单位。
超始坐标0,0是在该applet窗口的左上角处。
X坐标的值从0,0点开始向右逐渐增大,y坐标则沿着向下的方向增大。
Jdk1.2以前的版本在graphics里的x,y是不可以出现小数的,所有的像素值都是整数。
2、Point类
该类是形容一个图形坐标系统上的一个点。
构造方法如下:
Point()构造一个默认值为(0,0)的点;
Point(intx,inty)构造一个横纵座标初值为x和y的点;
Point(Pointp)以p构造一个点。
成员变量:
x:
横座标;
y:
纵座标。
一般方法:
voidmove(intx,inty)移动到坐标(x,y);Point1.java
3、Graphics类
大多数基本的绘图操作是在类Graphics中定义的方法,它是java.awt包的一部分。
这个类的对象表示了一个可以在里边绘制某些内容的环境,它可以是一个小应用程序窗口(如,我们在Applet那一章用到的drawString方法)、图形用户界面的一部分或者是一个打印机。
文本并不是我们能够使用Graphics类来绘制的唯一东西。
我们还可画直线、椭圆、圆、弧、矩形和其他多边形。
(1)直线
drawLine()方法是用来在两个点之间画一条直线。
该方法接收四个参数:
起点的x和y坐标以及终点的x和y坐标,线的宽度被设定成一个像素的大小。
drawLine(x1,y1,x2,y2)
(2)矩形
drawRect(x,y,w,h)绘制一个空心矩形;
fillRect(x,y,w,h)绘制一个实心矩形;
上面两个方法都接收四个参数:
矩形的左上角的x和y坐标、矩形的宽度和高度。
drawRoundRect(x,y,w,h,rx,ry)绘制一个空心的圆角矩形;
fillRoundRect(x,y,w,h,rx,ry)绘制一个实心的圆角矩形。
上面两个方法都接收六个参数:
矩形的左上角的x和y坐标、矩形的宽度和高度、圆角的宽度和高度(是一个外接圆)。
(3)多边形
drawPolygon(int[]x,int[]y,intnumPoints)
fillPolygon(int[]x,int[]y,intnumPoints)
多边形的多个顶点坐标参数数组(x,y)指定,x是所有顶点横坐标的集合,y是所有顶点纵坐标的集合,参数numPoints指定x和y的个数(即,多边形顶点的个数)。
GraphicsDraw.java
练习:
转动的三角。
T1201.java
(4)椭圆
drawOval(intx,inty,intw,inth)
fillOval(intx,inty,intw,inth)
椭圆画在一个左上角坐标为(x,y)、宽度和高度为(w,h)的矩形中,如果要是画圆,我们把w,h设为一样,即将其外接矩形指定为正方形即可。
(5)圆弧
drawArc(intx,inty,intw,inth,intst,intsw)
fillArc(intx,inty,intw,inth,intst,intsw)
圆弧画在一个左上角坐标为(x,y)、宽度和高度为(w,h)的矩形中。
圆弧的起点是st,经过sw指定的角度距离,角度按度数指定。
角度为零,在水平线上,即时钟3点钟的位置。
如果sw值为正值,按逆时针方向绘制圆弧;如果sw值为负值,则按顺时针方向画圆弧。
如,画一个3点到6点的逆时针圆弧,如下:
fillArc(100,100,200,200,0,270)
(6)复制和清除
copyArea(x,y,w,h,mx,my)
copyArea()方法接收六个参数:
要复制的矩形区域的x,y坐标、该区域的宽度和高度、在显示某个区域的一个备份之前要从该区域移动的水平和垂直间距,它们是以像素为单位。
如:
将一个100*100像素的区域复制到它右方50个像素、下方25个像素的区域上,如下:
copyArea(0,0,100,100,50,25)
方法clearRect()使用了与fillRect()方法相同的四个参数,它用当前窗口的背景色来填充这个矩形区域,效果就好象是擦除了该区域的东西。
(7)限定作图区域
clipRect(intx,inty,intwidth,intheight)
该方法接收四个参数,将作图区域限定在起始点坐标(x,y),width宽和height高的一个矩型中。
GraphicsDraw1.java
(8)设置颜色和字体
setBackground(Color.pink)设置当前窗口的背景色;
setForeground(Color.blue)设置当前窗口的前景色;
setColor(……)设置“画笔”的颜色;
getColor()
setFont(……)设置“画笔”的字体。
(9)设定画图模式
画图模式决定了对象如何在窗口中画图。
默认时,新输出的信息将覆盖窗口上先前存在的内容,然而,使用setXORMode()可以使用新的对象与窗口异或:
voidsetXORMode(ColorxorColor)
这里,画对象时,xorColor指定颜色将与窗口异或,XOR模式的优点是无论用什么颜色画对象,新对象总是保证看得见。
为了返回覆盖模式,调用下面的方法:
voidsetPaintMode()
通常,对一般的输出都用覆盖模式,特殊目的才用XOR模式。
GraphicsDraw2.java
(10)改变坐标值
translat(10,10)
它改变了一个坐标的值:
如果你以前的x和y的值是0,0如果你调用了translat以后就会把x和y的值改变。
(很少使用)
4、Dimension对象
我们可以通过调用窗口对象的getSize()方法,获得得窗口的当前尺寸。
该方法返回窗口的尺寸,值则封装在Dimension对象中,是该对象的两个成员变量。
intheight高度;
intwidth宽度;
构造方法:
Dimension()构造一个width,height的值分别是0;
Dimension(Dimensionf)通过另一个Dimension的对象把w,h的值传进来;
Dimension(intwidth,intheight)确定width,和height的大小。
其他方法:
(1)Dimension(ff).equals(Diemsionf)判断Dimension对象的值是否相等,实际上是指,width,height两个值是否相等;
(2)getSize()它是指获得Dimension对象的width,height的值;
(3)getHeight()
(4)getWidth()
(5)setSize(Dimensionf)它是指把一个已好的对象的值去初始化另一个对象;
(6)setSize(doublef,doublel)
(7)setSize(intf,intf)
(8)toString()用一个点去调用他,将返回这个点的信息,你再用StringBuffer输出来就可以看到这个点的详细情况;
5、FontMetrics类
Java支持多种字体,对大多数字体来说,字符的大小是不一样的---大多数字体的字符有一定的比例,也即不同的字体某个字符的高度、伸长部分(字符的悬挂部分)和水平线之间的空白是变化的。
此外,字体点阵的大小是可以修改的。
如果我们需要确切的知道某种字体的高度和宽度,就需要使用FontMetrics类。
几个常用术语:
Height:
字体中最高的字符从上端到下端的高度;
Baseline:
字符的底端对齐的线;
Ascent:
从基线到字符顶端的距离;
Descent:
从基线到字符底部的距离;
Leading:
一行文本底部到另一行文本顶端之间的距离;
构造方法:
FontMetrics(Fontfnt)由于该类是抽象类,不能直接使用new关键字创建,可以调用Component类的方法:
FontMetricsfm=getFontMetrics(fnt);fnt是Font类的实例。
常用方法:
intStringWidth(Stringstr)返回str指定的字符串的宽度;
intbyteWidth(byte[]b,intstart,intnumBytes)返回数组b中存储的numBytes个字符的宽度。
字符串的初始位置在start;
intcharWidth(char[]c,intstart,intnumChars)返回数组c中存储的numChars个字符的宽度。
字符串的初始位置在start;
intcharWidth(charc)返回c的宽度;
intcharWidth(intc)
intgetAscent()返回字体中最大的头部(上半截);
intgetDescent()返回字体中最大的尾部;
FontgetFont()返回字体;
intgetHeight()返回一行文本的高度值,这个值可被用于控制在窗口中输出多行文本;
intgetLeading()返回行间距;
intgetMaxAdvance()返回最宽字符的宽度。
如果这个值不可得,返回-1;
intgetMaxAscent()返回最大头部;
intgetMaxDescent()返回最大尾部;
int[]getWidths()返回最前面256个字符的宽度;
StringtoString()返回调用对象的字符串形式。
练习:
自动居中显示字符串。
Dimension1.java
二、图像
Java提供了对“成像”技术(图形图像的显示和处理)的支持。
本节主要讲述AWT的Image类和java.awt.image包。
图像是Image类的对象,该类是java.awt包的一部分。
图像是一个“矩形”的图形对象。
通过使用java.awt.image包中的类,可以实现对图像的操作。
java.awt.image定义了大量的成像类和接口,把它们全部介绍一遍几乎是不可能的。
作为一种替换的做法,我们将介绍形成成像基础的一些类和接口。
1、文件格式
最初,网上的图像只能是GIF格式的。
GIF图像格式由CompuServe公司在1987年创建的,它使在线查看图像成为可能,所以这种格式非常适合于Internet。
但是,每幅GIF图像最多只能有256种颜色,这个限制使一些订的浏览器开发商在1995年增加了对JPEG图像格式的支持。
JPEG格式是由一组图像专家创建的,用于存储具有全频谱、边疆色调的图像。
如果创建方法得当,当取用同一源图像时,这些JPEG图像将比GIF编码的图像具有更高的保真度和更大的压缩比。
在几乎任何情况下,我们都不要关心或注意程序使用的是哪一种格式的图像。
Java图像类抽象出了其接口后的不同。
2、图像的创建、装载和显示
处理图像时,通常会发生三种类型的操作:
创建图像、装载图像、显示图像。
在Java中,Image类一般用于特指内存中的图像以及必须从外部图片资源装载的图像。
(1)创建图像对象
java.awt包中的Component类有一个称为createImage()的方法,可用于创建Image对象,因为所有AWT组件都是Component的子类,所以它们都支持这个方法。
ImagecreateImage(ImageProducerimgProd)
ImagecreateImage(intwidth,intheight)
第一种方式将返回一个由imgProd生成的图像,而imgProd是实现ImageProducer接口的类的对象;第二种形式将返回一个具有指定宽度和高度的空图像(也就是空白图像)。
如果将一个图像与应用程序中的Image对象联系起来,我们可以调用Toolkit类的createImage()方法。
Toolkit用来在Java中提供和维护图形化的用户界面,我们无法创建Toolkit对象,但我们可以通过调用类方法来得到一个。
如:
Toolkitkit=Toolkit.getDefaultToolkit();
类Toolkit可以使用如下方法加载图像:
getImage(String)从图形文件中创建一个带有指定名字的Image对象,该名字可以是一个文件名(例如fillmore.jpg)或者到某个文件夹和文件名的引用(例如c:
\whigs\fillmore.jpg)。
getImage(URL)从由URL对象指定的因特网地址上的图形文件中创建一个Image对象。
(2)装载图像
另外一种得到图像的途径就是进行装载。
要这样做,需要使用由Applet类定义的getImage()方法。
它有下面的形式:
ImagegetImage(URLurl)
ImagegetImage(URLurl,StringimageName)
第一种形式返回一个Image对象,它将把出现在由url指定定位置的图像装入。
第二种形式也将返回一个Image对象,它装入的图像出现在由url批定的位置,其名字由imageName来确定。
通过一个小应用程序中调用getCodeBase(),我们可以得到一个URL对象,它代表着存放该小应用程序的类文件的文件夹。
另一个小应用程序方法,getDocumentBase(),返回了一个与加载该小应用程序相关的URL。
如:
ImagegetImage(getCodeBase(),img.jpg);
(3)显示图像
一旦拥有了一幅图像,可以通过使用Graphics类的一个成员drawImage()来显示它。
它有下面几种形式。
booleandrawImage(Imageimg,intx,inty,Colorbgcolor,ImageObserverobserver)
booleandrawImage(Imageimg,intx,inty,ImageObserverobserver)
显示由img传递的图像,图像的左上角位置由x,y确定。
Observer是实现ImageObserver接口的类的引用,这个接口可以由所有的AWT组件实现。
图像观测器(imageobserver)是一个在图像被装载时监视它的对象。
booleandrawImage(Imageimg,intx,inty,intwidth,intheight,Colorbgcolor,ImageObserverobserver)
booleandrawImage(Imageimg,intx,inty,intwidth,intheight,ImageObserverobserver)
显示由img传递的图像,图像的左上角位置由x,y确定,图像的外接矩型的宽和高由width和height确定,效果是图像被自由缩放在一个固定的区域内。
booleandrawImage(Imageimg,intdx1,intdy1,intdx2,intdy2,intsx1,intsy1,intsx2,intsy2,Colorbgcolor,ImageObserverobserver)
booleandrawImage(Imageimg,intdx1,intdy1,intdx2,intdy2,intsx1,intsy1,intsx2,intsy2,ImageObserverobserver)
显示由img传递的图像,图像的左上角位置由dx1,dy1确定,图像的右下角位置由dx2,dy2确定,sx1,sy1确定显示图像内容的左上角坐标,sx2,sy2确定显示图像内容的右下角坐标,效果就是只显示图像的一部分,并且在固定的区域内伸缩。
DrawImage.java
方法drawImage()的最后一个参数常常是关键字this,表示在一个对象内来引用对象本身。
这个关键字this是用来标明该小应用程序在从万维网上被下载下来时能够记录某个图像。
图像的加载是通过接口ImageObserver来跟踪记录的。
实现了这个接口的类,如Applet,可以记录一个图像的加载过程。
这可以用来创建某些程序,在加载图像文件时,这些程序会显示出一条诸如“Loadingimages…”之类的消息。
对ImageObserver现有的支持相对于小应用程序中的图像来说,已经是完全够用了,因此关键字this经常被用作drawImage()方法中。
当在Applet的init()方法中装载img时,我们可以在屏幕上看到它,这是因为每次更多的图像数据到达时,Applet的ImageObserver接口的实现会调用paint()方法。
3、ImageObserver
ImageObserver是一个接口,用于在图像生成时接收通知。
ImageObserver只定义了一种方法:
imageUpdate()。
使用图像观测器可以执行其他的操作,例如显示进程指示器或趣味屏幕。
booleanimageUpdate(Imageimg,intfags,intleft,inttop,intwidth,intheight)
img是被装载的图像,flags是与更新报告状态联系的一个整型数。
Left、top、width和height四个整型数代表了一个矩形,其中包含了依赖于flags中所传递数值的不同数值。
如果完成装载,imageUpdate()将返回false;如果有更多的图像需要处理,将返回true。
flags参数包含1位或多位标记,这些标记被定义为ImageObserver接口中的静态变量。
这些标记和它们所提供的信息如下所示:
WIDTHwidth参数是有效的并且包含图像的宽度值;
HEIGHTheight参数是有效的并且包含图像的高度值;
PROPERTIES现在可以使用img.getProperty()得到与图像相关联的属性;
SOMEBITS描绘图像所需的更多像素已被接收到。
参数left,top,width和height定义了包含新像素的矩形;
FRAMEBITS作为以前绘制的多帧图像一部分的一个完整帧已被接收到。
这个帧可以被显示。
不使用参数left,top,width和height;
ALLBITS图像完成。
不使用参数left,top,width和height;
ERROR被异步追踪的一个图像发生了错误。
图像没有被完成,不能显示。
不会有更多的图像信息被接收。
ABORT标记将被设置,以指示图像制作过程失败;
ABORT被异步追踪的一个图像在完成前被放弃。
不过,如果没有错误发生,对任何图像数据的访问都将重新启动图像的制作过程。
在实际中,我们需要覆盖imageUpdate()方法。
因为在Applet中,imageUpdate()的默认实现方式存在几个问题。
(1)在新数据到达时,它会重新绘制整个图像。
这会引起背景颜色和图像的不断闪烁。
(2)它使用Applet.repaint()的功能使系统每隔1/10秒左右的时间来重新绘制图像。
如果图像处于正在绘制的过程中,这会给人一种不稳定、不舒服的感觉。
(3)默认的实现过程对可能装载失败的图像一无所知。
很多刚开始进行Java编程的程序员都遇到过一种事情,就是getImage()总是会成功,而被指定的图像可能根本就不存在。
除非出现imageUpdate(),否则就不可能发现丢失的图像。
如果采用imageUpdate()的默认实现过程,那么就永远也无法知道到底发生了什么事。
在调用g.drawImage()的时候,paint()方法不会做任何事。
DrawImage1.java
4、双缓冲技术
Netmeeting观看MoveText.java,使图像产生抖动的根本原因在于Applet中的update()方法,当在Applet中repaint()调update()方法,update()调paint()方法。
publicvoidupdate(Graphicsg){
g.setColor(getBackground());
g.fillRect(0,0,width,height);
g.setColor(getForeground());
paint(g);
}
整个update()方法的工作过程是首先以当前窗口的背景色填充整个窗口,然后再调用paint()方法重新绘制,所以产生抖动。
解决抖动的方法是使用以缓冲技术(double-buffer),即把欲输出的内容首先输出在后台,再输出整个后台。
即使用图像脱屏的方法来减轻屏幕抖动。
实现双缓冲的步骤如下:
(1)创建后台
ImageoffScreenImage=createImage(getSize().width,getSize().height);
GraphicsoffScreenGraphics=offScreenImage.getGraphics();
(2)把原来paint方法中执行的绘图动作移到后台完成
offScreenGraphics.draw……
(3)在paint方法中最后输出后台
g.drawImage(offScreenImage,0,0,this);
(4)覆盖update()方法
publicvoidupdate(Graphicsg){
paint(g);
}
练习:
建一个applet,两个线程,一个在下面显示跑马灯字幕,一个在上面显示闪烁信息。
Jxt12c.java
5、MediaTracker类
许多早期的Java开发者都发现,在有多个图像需要装载时,ImageObserver接口理解和管理起来非常困难。
于是找到一种更简单的解决方法,以允许程序员同时装载全部图像,而不必考虑imageUpdate()。
为了响应这个要求,Sun公司在JDK的后续版本中添加了这个类,是用来进行图像的跟踪的,用于检查若干并行图像随机状态的对象。
要使用MediaTracker,需创建一个新的实例并使用它的addImage()方法来跟踪图像的装载状态。
MediaTrackertracker=newMediaTracker(this);构造方法需要一个Component类实例
voidaddImage(Imageimg,intimgID)
voidaddImage(Imageimg,intimgID,intwidth,intheight)
成员变量:
ABORTED:
失败
COMPLETE:
完成
ERRORED:
错误
LOADING:
装载
这里,img是被跟踪的图像。
它的识别号码由imgID传递。
ID编
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 图形图像 以及 动画