《Java程序设计电子教案第九章.ppt》由会员分享,可在线阅读,更多相关《Java程序设计电子教案第九章.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第9章章 java 多媒体设计多媒体设计9.1图形处理图形处理9.2图像处理图像处理9.3 2D图像图像9.4 动画处理动画处理9.5 播放声音播放声音9.1图形处理图形处理Java所有与图形有关的功能都包含在所有与图形有关的功能都包含在AWT包里。包里。AWT(Abstract Windows Toolkit)是抽象窗口工具包是抽象窗口工具包的缩写,支持窗口界面的创建、简单图形的绘制、图形化文的缩写,支持窗口界面的创建、简单图形的绘制、图形化文本本 输出和事件监听。用户可利用输出和事件监听。用户可利用AWT提供的类和方法,在提供的类和方法,在窗口上绘制各种各样的图形和窗口上绘制各种各样的图
2、形和 文本,增加界面的美观。基本文本,增加界面的美观。基本图形包括点、线、圆、矩形等,是构成复杂图形的基础。绘图形包括点、线、圆、矩形等,是构成复杂图形的基础。绘制基本图形要使用制基本图形要使用AWT中的中的Graphics类,它提供了各种基类,它提供了各种基本图形的绘制方法。本图形的绘制方法。下一页返回9.1图形处理图形处理911 直线直线public void drawLine(int x1,int y1,int x2,int y2)参数参数(x1,y1)和和(x2,y2)是所画直线的两个端点坐标。是所画直线的两个端点坐标。方法的功能是:在点方法的功能是:在点(x1,y1)和和(x2,y2
3、)之间画直线。之间画直线。在窗口上随机绘制在窗口上随机绘制10条直线。条直线。/DrawLines.java import java.applet.*;import java.awt.*;import java.lang.*;public class DrawLines extends Applet public void paint(Graphics g)上一页 下一页返回9.1图形处理图形处理int i,x1,y1,x2,y2;for(i=1;i=10;i+)x1=(int)(Math.random()*10);y1=(int)(Math.random()*200);x2=(int)(Ma
4、th.random()*380);y2=(int)(Math.random()*200);g.drawLine(x1,y1,x2,y2);上一页 下一页返回9.1图形处理图形处理根据题目的要求,我们使用一组随机数来指定直线两个端点根据题目的要求,我们使用一组随机数来指定直线两个端点的坐标,并采用循环结构实现的坐标,并采用循环结构实现10次循环。次循环。drawLine方法中方法中的的4个整型参数代表直线两个端点的坐标。个整型参数代表直线两个端点的坐标。random()是是Math类中的一个方法,该方法返回一个类中的一个方法,该方法返回一个double值,值域为值,值域为(00,10)。Math
5、类是类是java1ang包的一部分包的一部分java1ang可由编译器自动引入,所以我们不必把可由编译器自动引入,所以我们不必把Math类引入到程序中。直接调用类引入到程序中。直接调用random方法得到返回值太小,方法得到返回值太小,在实际应用中往往乘以一个整数因子,并强制类型转换在实际应用中往往乘以一个整数因子,并强制类型转换 为为一个合适的整数。如一个合适的整数。如(int)(Mathrandom()x100)的实的实际取值范围为际取值范围为0,100。在图形方式下要想准确定位,必须。在图形方式下要想准确定位,必须了解屏幕坐标系的构成。了解屏幕坐标系的构成。Java定义一个窗口工作区的左
6、上角定义一个窗口工作区的左上角为坐标原点为坐标原点(o,o),以像素点为单位,顺序向右和向下延伸。,以像素点为单位,顺序向右和向下延伸。图形的大小如超过窗口,则超出部分不会显示出来。图形的大小如超过窗口,则超出部分不会显示出来。上一页 下一页返回9.1图形处理图形处理9.1.2设置颜色设置颜色.创建创建 Color类的一个对象类的一个对象(1)public Color(int r,int g,int b)整数整数 r,g,b 分别表示红,绿,蓝的含量分别表示红,绿,蓝的含量(2)public Color(int r,int g,int b,int a);整数整数a表示表示alpha值,它们的取
7、值为值,它们的取值为 0 到到 255。(3)public Color(float r,float g,float b)单精度浮点数单精度浮点数 r,g,b分别表示红,绿,蓝的含量分别表示红,绿,蓝的含量(4)public Color(float r,float g,float b,float a)单精度浮点数单精度浮点数a表示表示alpha值,它们的取值范围是值,它们的取值范围是 0.0f到到1.0f上一页 下一页返回9.1图形处理图形处理(5)public Color(int rgb)整型参数整型参数rgb指明红(指明红(1623bits表示)表示)绿(绿(815bits表示)蓝(表示)蓝
8、(07bits表示)三色的取值。表示)三色的取值。(1)使用使用Graphics类中方法:类中方法:public void setColor(Color c)设置颜色。设置颜色。(2)使用使用Color类的以下几个方法获取颜色对象:类的以下几个方法获取颜色对象:public Color getColor();返回当前颜色对象。返回当前颜色对象。public int getRed();得到颜色对象的;得到颜色对象的red分量。分量。public int getGreen();得到颜色对象的;得到颜色对象的green值。值。public int getBlue();得到颜色对象的;得到颜色对象的b
9、lue值。值。public int getAlpha();得到颜色对象的;得到颜色对象的alpha值。值。上一页 下一页返回9.1图形处理图形处理/TestColor.Javaimport java.applet.Applet;import java.awt.Graphics;import java.awt.Font;import java.awt.Color;public class TestColor extends Applet public void paint(Graphics g)上一页 下一页返回9.1图形处理图形处理 String s=中国北京中国北京;Color c1=new
10、 Color(255,0,0);Color c2=new Color(255,0,0,128);Color c3=Color.blue;g.setColor(c1);g.drawString(红色:红色:+s,20,20);g.setColor(c2);g.drawString(红色:红色:+s,20,40);g.setColor(c3);g.drawString(蓝色:蓝色:+s,20,60);上一页 下一页返回9.1图形处理图形处理9.1.3字符数组和字节数组的显示字符数组和字节数组的显示Graphics 类的以下方法显示字符串、字符数组和字节数组:类的以下方法显示字符串、字符数组和字节数
11、组:(1)绘制字符串绘制字符串 void drawString(String string,int x,int y)坐标点坐标点(x,y)与要绘制的字符串与要绘制的字符串 string左下角相对应。左下角相对应。(2)绘制字符数组绘制字符数组void drawChars(char chars,int offset,int number,int x,int y)offset 是数组的起始下标,是数组的起始下标,number 是要绘制的元素个数。是要绘制的元素个数。(3)绘制字节数组绘制字节数组void drawBytes(byte bytes,int offset,int number,int
12、x,int y)offset 是数组的起始下标,是数组的起始下标,number 是要绘制的元素个数。是要绘制的元素个数。上一页 下一页返回9.1图形处理图形处理/DrawCharByte.javaimport java.applet.*;import java.awt.*;public class DrawCharByte extends Applet public void init()setBackground(new Color(0,128,0);public void paint(Graphics g)g.setFont(new Font(华文行楷华文行楷,Font.BOLD,40);
13、上一页 下一页返回9.1图形处理图形处理String s=中国北京中国北京;char ch=new chars.length();s.getChars(0,4,ch,0);g.setColor(Color.red);g.drawChars(ch,2,2,20,40);byte byt=65,66,67,68,69,70,71,72,73,74,75;g.setFont(new Font(Arial,Font.ITALIC,30);g.setColor(Color.red);g.drawBytes(byt,0,5,120,40);g.setColor(Color.white);g.drawByt
14、es(byt,0,5,122,38);上一页 下一页返回9.1图形处理图形处理9.1.4 绘制绘制Rectangle(1)画矩形:画矩形:public void drawRect(int x,int y,int width,int height);x,y是矩形左上角坐标;是矩形左上角坐标;width,heigh是矩形的宽度和是矩形的宽度和高度。高度。(2)用当前设置的颜色画填充矩形:用当前设置的颜色画填充矩形:public void fillRect(int x,int y,int width,int height);(3)清除指定的矩形区域,该区域颜色将为背景颜色:清除指定的矩形区域,该区域
15、颜色将为背景颜色:public void clearRect(int x,int y,int width,int height);上一页 下一页返回9.1图形处理图形处理(4)画圆角矩形:画圆角矩形:public void drawRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight);public void fillRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight);前前4个参数的含义同上;个参数的含义同上;arcWi
16、dth-水平方向圆弧的总宽水平方向圆弧的总宽度;度;arcHeight-垂直方向圆弧的总高度。垂直方向圆弧的总高度。上一页 下一页返回9.1图形处理图形处理/DrawRectangle.javaimport java.applet.*;import java.awt.*;public class DrawRectangle extends Applet public void paint(Graphics g)setBackground(Color.cyan);g.setColor(Color.blue);g.fillRect(20,20,40,40);/为了演示为了演示clearRect()
17、方法的效果,先画一个比清除的区方法的效果,先画一个比清除的区域大域大2个像素的填充矩形。个像素的填充矩形。g.fillRect(79,19,42,42);上一页 下一页返回9.1图形处理图形处理g.clearRect(80,20,40,40);g.fillRoundRect(140,20,40,40,40,40);9.1.5 绘制椭圆和弧绘制椭圆和弧(1)画椭圆画椭圆 public void drawOval(int x,int y,int width,int height);public void fillOval(int x,int y,int width,int height);(2)画
18、圆弧画圆弧 画圆弧就是画部分椭圆的圆弧和填充扇形。画圆弧就是画部分椭圆的圆弧和填充扇形。上一页 下一页返回9.1图形处理图形处理 public void drawArc(int x,int y,int width,int height,int startAngle,int arcAngle)public void fillArc(int x,int y,int width,int height,int startAngle,int arcAngle)startAngle是弧的起始角度;是弧的起始角度;arcAngle 表示从起始角度算起转多少度,逆时针为正。表示从起始角度算起转多少度,逆时针为
19、正。画椭圆的方法画椭圆的方法drawOval(),fillOval具有相同的参数,前具有相同的参数,前两个参数用来定位,实际指定的是包围椭圆的矩形的左上角两个参数用来定位,实际指定的是包围椭圆的矩形的左上角位置,后位置,后2个参数指定了椭圆的宽度和高度,如果取相同值,个参数指定了椭圆的宽度和高度,如果取相同值,则画出的是正圆。则画出的是正圆。drawArc方法可画圆弧,方法可画圆弧,fillArc方法实方法实际画出的是扇形。圆弧是椭圆的一部分,夹际画出的是扇形。圆弧是椭圆的一部分,夹 在两个角之间,在两个角之间,因此画圆弧的方法比画椭圆的方法多了两个参数:起始角和因此画圆弧的方法比画椭圆的方法
20、多了两个参数:起始角和张角张角(以角度为单位以角度为单位)。起始角确定了圆弧的起始位置;张角。起始角确定了圆弧的起始位置;张角确定了圆弧的大小,取正确定了圆弧的大小,取正(负负)值为沿逆值为沿逆 (顺加寸针方向画出顺加寸针方向画出圆弧。当张角取值大于圆弧。当张角取值大于360时,画出的就是椭圆。我们用一时,画出的就是椭圆。我们用一个例子来说明这两个方法的使用。个例子来说明这两个方法的使用。上一页 下一页返回9.1图形处理图形处理/DrawOval.javaimport java.applet.*;import java.awt.*;public class DrawOval extends A
21、pplet public void paint(Graphics g)g.setColor(Color.blue);g.drawRect(20,20,100,60);g.fillOval(20,20,100,60);g.drawOval(140,20,100,60);g.fillArc(140,20,100,60,0,60);上一页 下一页返回9.1图形处理图形处理9.1.6画多边形画多边形将多边形的各个顶点的坐标对应放到整型数组将多边形的各个顶点的坐标对应放到整型数组xPoints(x坐标)和整型数组坐标)和整型数组yPoints(y坐标)中,用以下方法画多坐标)中,用以下方法画多边形和填充
22、多边形:边形和填充多边形:public void drawPolygon(int xPoints,int yPoints,int points);public void fillPolygon(int xPoints,int yPoints,int points);参数参数points表示顶点的个数。创建表示顶点的个数。创建Polygon类的对象类的对象p画多画多边形边形 Polygon类的构造函数:类的构造函数:上一页 下一页返回9.1图形处理图形处理 Polygon();Polygon(int xPoints,int yPoints,int points);画多边形画多边形 public
23、void drawPolygon(Polygon p);public void fillPolygon(Polygon p);追加顶点坐标的方法:追加顶点坐标的方法:public void addPoint(int x,int y)。/DrawPolygon.javaimport java.applet.*;import java.awt.*;public class DrawPolygon extends Applet上一页 下一页返回9.1图形处理图形处理 public void paint(Graphics g)int x=20,40,80,100,80,40;int y=40,20,2
24、0,40,60,60;g.setColor(Color.blue);g.fillPolygon(x,y,6);int x1=140,160,200,220,200,160;int y1=40,20,20,40,60,60;Polygon p=new Polygon(x1,y1,6);g.fillPolygon(p);上一页 下一页返回9.1图形处理图形处理多边形的多边是分别用两个整数数组来表示多边形的多边是分别用两个整数数组来表示x坐标和坐标和y坐标的,坐标的,并用一个整数表示多边的顶点数,多边形可以说是封闭的,并用一个整数表示多边的顶点数,多边形可以说是封闭的,也可以是开放的,取决于最后一条
25、直线终点坐标的取值,若也可以是开放的,取决于最后一条直线终点坐标的取值,若和第一条直线的起点坐标重合画出的多边形为封闭的,否则和第一条直线的起点坐标重合画出的多边形为封闭的,否则为开放的。为开放的。上一页返回9.2 图像处理图像处理/ShowImage.Javaimport java.applet.*;import java.awt.*;public class ShowImage extends Applet public void paint(Graphics g)Image pic=getImage(getDocumentBase(),a.jpg);int w=pic.getWidth(
26、this),h=pic.getHeight(this),d=5;下一页返回9.2 图像处理图像处理g.drawImage(pic,0,0,w,h,this);/按原图宽高显示按原图宽高显示g.drawImage(pic,w+d,0,w/2,h/2,this);/缩小为原图宽高的一半并显示缩小为原图宽高的一半并显示/截取原图右下角的截取原图右下角的1/4并显示并显示g.drawImage(pic,w+d,h/2,w+w/2+d,h,w/2,h/2,w,h,this);上一页 下一页返回9.2 图像处理图像处理我们以这个程序为例,总结出在我们以这个程序为例,总结出在Java程序中显示一幅图像的程序
27、中显示一幅图像的步骤。图像显示分为两个步骤:首先加载图像步骤。图像显示分为两个步骤:首先加载图像(即将图像文件即将图像文件读入内存读入内存),然后画出图像。程序创建了一个,然后画出图像。程序创建了一个Image 对象对象img,通过,通过Applet的的getlmage方法加载图像文件方法加载图像文件ajpg,将它和,将它和img联系起来。然联系起来。然 后通过后通过Graphics的的drawlmage方法显示图像。方法显示图像。加载图像加载图像 加载图像一般放在初始化方法加载图像一般放在初始化方法init中进行。程序中的中进行。程序中的getlmage方法可加载方法可加载Java支持的图像
28、文件,它有两个参支持的图像文件,它有两个参数,一个是图像文件地址,一个是图像文件名称。由于数,一个是图像文件地址,一个是图像文件名称。由于Applet 是面向网络的,因此图像文件的存储位置并不局限是面向网络的,因此图像文件的存储位置并不局限于本地计算机的磁盘目录,大部分情况是直接读取于本地计算机的磁盘目录,大部分情况是直接读取Web服务服务器上的图像文件。器上的图像文件。getlmage方法返回一个方法返回一个Image对象,对象,它的调用格式为:它的调用格式为:上一页 下一页返回9.2 图像处理图像处理 Image getlmage(URL url)Image getlmage(URL ur
29、l,String name)其中其中url是一个是一个URL类的对象,类的对象,J代表一个网络地址,例如下代表一个网络地址,例如下面的语句可以加载面的语句可以加载sun公司公司Web服务器指定位置上的一幅图服务器指定位置上的一幅图片:片:getlmage(newURL(http:jaVaskincomgraphicspeoplegif”);上述程序中没有直接给出一个具体网络地址,因为在不熟悉上述程序中没有直接给出一个具体网络地址,因为在不熟悉网站的情况下读取图像文件是毫无意义的。另一方面,设计网站的情况下读取图像文件是毫无意义的。另一方面,设计Applet一般是为了显示自己已经准备好的图像,所
30、以程序使一般是为了显示自己已经准备好的图像,所以程序使用了用了getCodeBase方法。方法。getCodeBase返回的是返回的是Applet文件所在的地址,即该文件所在的目录,我们是把图文件所在的地址,即该文件所在的目录,我们是把图像文件和像文件和Applet文件放在同一个目录下的,这样就能保证程文件放在同一个目录下的,这样就能保证程序找到该图像文件。另外,使用序找到该图像文件。另外,使用getDocumentBase方法方法也可以达到同样目的。也可以达到同样目的。上一页 下一页返回9.2 图像处理图像处理 2、显示图像、显示图像显示图像需要调用显示图像需要调用Graphics类的方法类
31、的方法drawlmage,它可,它可以将以将Image对象关联的图像对象关联的图像 显示在显示在Applet的指定位置。的指定位置。drawlmage方法的调用格式如下:方法的调用格式如下:boolean drawlmage(1mage img,int x,int y,ImageObserver observer)boolean drawlmage(1mage img,int x,int y,Color bgcolor,ImageObserver observer)其中其中img就是要显示的图像,就是要显示的图像,x和和y是图像显示位置是图像显示位置(x和和y可可取负值,表示一部分图像被移出了
32、显示区取负值,表示一部分图像被移出了显示区)、bgcolor是图像是图像显示区域的背景色、显示区域的背景色、observer是图像加载跟踪器,通常将是图像加载跟踪器,通常将该参数指定为该参数指定为this,即由,即由Applet负责跟踪图像的加载情况。负责跟踪图像的加载情况。这两种方法都是将图像照原样显示,能不能对图像进行缩放这两种方法都是将图像照原样显示,能不能对图像进行缩放呢呢?使用下面两种调用格式就可以对图像进行缩放显示:使用下面两种调用格式就可以对图像进行缩放显示:boolean drawlmage(1mage img,int x,int y,int width,int height,
33、ImageObserver Observer)上一页 返回9.3 2D图像图像画图类画图类Graphics2D:更强大的图形处理功能。它是更强大的图形处理功能。它是Graphics类的子类。类的子类。Graphics2D g2d=(Graphics2D)g;1创建各种图形对象创建各种图形对象java.awt.geom包中提供了很多构造图形对象的类包中提供了很多构造图形对象的类。直线:直线:Line2D line=new Line2D.Double(20.0,20.0,320.0,20.0);起点在起点在(20.0,20.0),终点在,终点在(320.0,20.0)。长方形:长方形:下一页返回9
34、.3 2D图像图像Rectangle2D rect=new Rectangle2D.Double(20.0,30.0,90.0,60.0);左上角坐标为左上角坐标为(20.0,30.0),宽、高分别为,宽、高分别为90.0和和60.0 椭圆:椭圆:Ellipse2D ellipse=new Ellipse2D.Double(220.0,30.0,90.0,60.0);2改变绘图时画笔的大小改变绘图时画笔的大小创建创建BasicStroke类对象,并使用类对象,并使用Graphics2D类的方法:类的方法:setStroke(BasicStroke bstroke)可以改变画笔线条的宽度。可以改
35、变画笔线条的宽度。上一页 下一页返回9.3 2D图像图像例如,下面的语句设置画笔线条的宽度为例如,下面的语句设置画笔线条的宽度为3像素:像素:BasicStroke bstroke=new BasicStroke(3.0f);g2d.setStroke(bstroke);/Draw2D.javaimport java.applet.*;import java.awt.*;import java.awt.geom.*;public class Draw2D extends Applet public void paint(Graphics g)上一页 下一页返回9.3 2D图像图像Graphic
36、s2D g2d=(Graphics2D)g;/把父类对象强把父类对象强制转化为子类对象制转化为子类对象BasicStroke bstroke=new BasicStroke(3.0f);/画笔线条的宽度画笔线条的宽度g2d.setStroke(bstroke);Line2D line=new Line2D.Double(20.0,20.0,320.0,20.0);g.setColor(Color.blue);g2d.draw(line);g.setColor(Color.red);Rectangle2D rect=new Rectangle2D.Double(20.0,30.0,90.0,60
37、.0);g2d.draw(rect);RoundRectangle2D r_rect=new 上一页 下一页返回9.3 2D图像图像RoundRectangle2D.Double(120.0,30.0,90.0,60.0,50.0,25.0);g2d.draw(r_rect);Ellipse2D ellipse=new Ellipse2D.Double(220.0,30.0,90.0,60.0);g2d.draw(ellipse);用渐变颜色画填充图形用渐变颜色画填充图形1.java.awt包中类包中类GradientPaint的构造方法:的构造方法:public GradientPaint(
38、float x1,float y1,Color color1,float x2,float y2,Color color2);上一页 下一页返回9.3 2D图像图像可创建渐变颜色。可创建渐变颜色。前三个参数指定坐标点前三个参数指定坐标点(x1,y1)的颜色为的颜色为color1;后三个参数指定坐标点后三个参数指定坐标点(x2,y2)的颜色为的颜色为color2;它们之间的颜色由它们之间的颜色由color1渐变到渐变到color2。2.通过通过Graphics2D类的方法类的方法:setPaint(GradientPaint gradColor)设置画图显示的颜色为渐变色。设置画图显示的颜色为渐
39、变色。如何创建和设置渐变色如何创建和设置渐变色 上一页 下一页返回9.3 2D图像图像/Draw2DFill.Javaimport java.applet.*;import java.awt.*;import java.awt.geom.*;public class Draw2DFill extends Applet public void paint(Graphics g)上一页 下一页返回9.3 2D图像图像Graphics2D g2d=(Graphics2D)g;/把父类对象强把父类对象强制转化为子类对象制转化为子类对象GradientPaint gradColor=new Gradie
40、ntPaint(0.0f,0.0f,Color.blue,200.0f,0.0f,Color.green);g2d.setPaint(gradColor);Rectangle2D rect=new Rectangle2D.Double(0.0,0.0,200.0,60.0);g2d.fill(rect);上一页 下一页返回9.3 2D图像图像java.awt.geom包中提供了包中提供了AffineTransform类,实现类,实现图象的平移、缩放和旋转等功能。图象的平移、缩放和旋转等功能。1.图形的平移图形的平移 public void translate(double tx,double
41、ty);参数参数tx指定图形水平方向平移的像素值;指定图形水平方向平移的像素值;参数参数ty指定图形垂直方向平移的像素值。指定图形垂直方向平移的像素值。2.图形的旋转图形的旋转 public void rotate(double theta,double x,double y);第一个参数指定顺时针方向转过的角度,以弧度为单位;第一个参数指定顺时针方向转过的角度,以弧度为单位;参数参数x和和y指定平面图形转动的轴点。指定平面图形转动的轴点。上一页 下一页返回9.3 2D图像图像3.图形的缩放图形的缩放 public void scale(double sx,double sy);参数参数sx和
42、和sy分别表示分别表示x方向和方向和y方向的缩放因子方向的缩放因子(倍数倍数)。/Draw2DTransform.javaimport java.applet.*;import java.awt.*;import java.awt.geom.*;public class Draw2DTransform extends Applet public void paint(Graphics g)上一页 下一页返回9.3 2D图像图像Graphics2D g2d=(Graphics2D)g;/把父类对象强把父类对象强制转化为子类对象制转化为子类对象BasicStroke bstroke=new Bas
43、icStroke(2.0f);g2d.setStroke(bstroke);/设置画笔画设置画笔画线的宽度线的宽度g2d.setColor(Color.blue);AffineTransform transf=new AffineTransform();QuadCurve2D quadCurve=new QuadCurve2D.Double(20.0,20.0,60.0,15.0,80.0,80.0);g2d.draw(quadCurve);上一页 下一页返回9.3 2D图像图像transf.translate(100.0,0.0);double rad=Math.toRadians(360.
44、0/30);for(int i=0;i30;i+)transf.rotate(rad,80.0,80.0);g2d.setTransform(transf);g2d.draw(quadCurve);上一页 下一页返回9.3 2D图像图像transf.scale(2,2);transf.translate(100.0,0.0);for(int i=0;i30;i+)transf.rotate(rad,80.0,80.0);g2d.setTransform(transf);g2d.draw(quadCurve);上一页返回9.4 动画处理动画处理动画是指连续而平滑地显示多幅图像。动画的质量一方面取
45、动画是指连续而平滑地显示多幅图像。动画的质量一方面取决于图像的质量,另一方面则取决于平滑程度。在计算机上,决于图像的质量,另一方面则取决于平滑程度。在计算机上,以以10一一30幅每秒钟的速度显示动画即可达到满意的动画幅每秒钟的速度显示动画即可达到满意的动画质量。在很多软件尤其是游戏软件的设计中,动画向程序员质量。在很多软件尤其是游戏软件的设计中,动画向程序员提出了挑战,但在提出了挑战,但在java中实现动画则是十分简单的事情。中实现动画则是十分简单的事情。下面让我们一起由浅人深地编写几个动画程序实例,并通过下面让我们一起由浅人深地编写几个动画程序实例,并通过对这些实例的逐步改进来探讨对这些实例
46、的逐步改进来探讨Java动画技术的关键。动画技术的关键。下一页返回9.4 动画处理动画处理9.41 动画原理动画原理 其实,计算机动画原理十分简单,首先在屏幕上显示出第一其实,计算机动画原理十分简单,首先在屏幕上显示出第一帧画面,过一会儿把它擦掉,然后再显示下一帧画面,如此帧画面,过一会儿把它擦掉,然后再显示下一帧画面,如此循环往复。由丰人眼存在着一个视觉差,所以感觉好像循环往复。由丰人眼存在着一个视觉差,所以感觉好像 画画面中的物体在不断运动。面中的物体在不断运动。/MovingImg.javaimport java.awt.*;import java.applet.*;public cla
47、ss MovingImg extends Applet Image star,messenger_big;int x=10;public void init()上一页 下一页返回9.4 动画处理动画处理star=getImage(getCodeBase(),merlin.gif);messenger_big=getImage(getCodeBase(),messenger_big.gif);public void paint(Graphics g)g.drawImage(star,0,0,this);g.drawImage(messenger_big,x,15,this);try Thread
48、.sleep(50);x+=5;if(x=210)x=10;Thread.sleep(1000);catch(InterruptedException e)上一页 下一页返回9.4 动画处理动画处理repaint();这是一个很简单的动画,在这是一个很简单的动画,在Applet中有一个小人,一个中有一个小人,一个windows message的图标上不断从左边移动到右边。程的图标上不断从左边移动到右边。程序中创建了两个序中创建了两个Image对象对象star和和messenger_big,在,在init方法中分别加载了两个图像文件和这两个对象关联起来。方法中分别加载了两个图像文件和这两个对象关
49、联起来。添加了变量添加了变量x用来指定飞船的画出位置,用来指定飞船的画出位置,x初始化为初始化为l0。在。在paint方法中,注意到方法中,注意到Applet中总是画在指定位置中总是画在指定位置(x,10),而另一个则画在位置,而另一个则画在位置(x,15),其中,其中x的值是不断变化的。的值是不断变化的。上一页 下一页返回9.4 动画处理动画处理真正使图标实现动画效果是在真正使图标实现动画效果是在trycatch块中。程序调块中。程序调用了用了sleep方法,它是方法,它是 Thread类中定义的一个类方法,类中定义的一个类方法,调用它可使程序休眠指定的毫秒数。调用它可使程序休眠指定的毫秒数
50、。sleep方法会产生方法会产生 中中断异常,因此必须放在断异常,因此必须放在trycatch块中。如果不调用块中。如果不调用sleep方法,程序将全速运行,必将导致换帧速度太快,画方法,程序将全速运行,必将导致换帧速度太快,画面闪烁严重。休眠时间设定为面闪烁严重。休眠时间设定为50毫秒,相当于换帧速度毫秒,相当于换帧速度20(1 00050)。休眠结束后。休眠结束后x的值加的值加5,意味着下一帧图,意味着下一帧图标画面的显示位置向右移动标画面的显示位置向右移动5个个 点。当飞船移动到最右边即点。当飞船移动到最右边即210点位置时,将点位置时,将x赋值赋值10,图标重新回到了左边,这是在,图标