Presentation is loading. Please wait.

Presentation is loading. Please wait.

第11章 图形与多媒体处理 11.1 基本图形 11.2 画布 11.3 文字输出 11.4 颜色控制 11.5 图像处理

Similar presentations


Presentation on theme: "第11章 图形与多媒体处理 11.1 基本图形 11.2 画布 11.3 文字输出 11.4 颜色控制 11.5 图像处理"— Presentation transcript:

1 第11章 图形与多媒体处理 11.1 基本图形 11.2 画布 11.3 文字输出 11.4 颜色控制 11.5 图像处理
第11章 图形与多媒体处理 11.1 基本图形 11.2 画布 11.3 文字输出 11.4 颜色控制 11.5 图像处理 11.6 动画处理 11.7 加载声音文件 习题

2 AWT(Abstract Windows Toolkit)是抽象窗口工具包的缩写,其支持窗口界面的创建、简单图形的绘制、图形化文本输出和事件监听。Java所有与图形有关的功能都包含在AWT包里。

3 11.1 基本图形 基本图形包括点、线、圆、矩形等,是构成复杂图形的基础。绘制基本图形要使用AWT中的Graphics类,它提供了各种基本图形的绘制方法,可以直接引用这些方法。

4 11.1.1 直线 例11.1 在窗口上随机绘制10条直线,如图11.1所示。 import java.applet.Applet;
import java.awt.Graphics; public class DrawLines extends Applet { public void paint(Graphics g) { int i, x1, y1, x2, y2; for (i=1; i<=10; i++) { x1=(int) (Math.random()*10); y1=(int) (Math.random()*200); x2=(int) (Math.random()*380); y2=(int) (Math.random()*200); g.drawLine(x1,y1,x2,y2); } }

5 图 11.1

6 根据题目的要求,在例子中使用一组随机数来指定直线两个端点的坐标,并采用循环结构实现10次循环。
drawLine(x1,y1,x2,y2)方法中的4个整型参数(x1,y1,x2,y2)代表直线两个端点的坐标。random()是Math类中的—个方法,该方法返回一个double值,值域为(0.0,1.0)。 在图形方式下要想准确定位,必须了解屏幕坐标系的构成。Java定义一个窗口工作区的左上角为坐标原点(0,0),以像素点为单位,顺序向右和向下延伸。图形的大小如超过窗口,则超出部分不会显示出来。

7 11.1.2 矩形 例11.2 利用Graphics的方法,在窗口中画出若干个矩形,结果如图11.2所示。
import java.applet.Applet; import java.awt.Graphics; public class Rectangles extends Applet { public void paint(Graphics g) { g.drawRect(20,30,80,80); g.fillRect(120,30,80,80); g.drawRoundRect(220,30,80,80,20,20); g.fillRoundRect(320,30,80,80,20,20); } }

8 图 11.2

9 drawRect方法可画一个矩形框,前两个参数指定矩形左上角的位置,后两个参数代表矩形的宽度和高度。fillRect和drawRect的惟一不同之处在于,前者画出矩形框后用前景色填充。drawRoundRect方法的前4个参数和drawRect的4个参数有相同的含义,后两个参数则代表了圆角的宽度和高度。如果想得到一个较为扁平的圆角,可取大一点的数值;反之,可取小一点的数值。fillRoundRect则用填充前景色的方式画出圆角矩形。

10 例11.3 利用Graphics的方法画三维矩形,结果如图11.3所示。 图 11.3

11 import java.applet.Applet;
import java.awt.Graphics; import java.awt.Color; public class Draw3DRects extends Applet { public void paint(Graphics g) { g.setColor(Color.yellow); g.draw3DRect(20,30,80,80,true); g.draw3DRect(120,30,80,80,false); g.fill3DRect(220,30,80,80,true); g.fill3DRect(320,30,80,80,false); } } 程序引入了AWT中的Color类,用来设定前景色。方法中的最后一个参数为布尔值,设为true时,画出的三维矩形是凸起的,设为false时,画出的三维矩形是凹陷的。

12 椭圆 画椭圆的方法drawOval和fillOval具有相同的参数。前两个参数用来定位,实际指定的是包围椭圆的矩形的左上角位置,后两个参数指定了椭圆的宽度和高度,如果取相同值,则画出的是正圆。

13 例11.4 用drawOval和fillOval 方法分别画椭圆,结果如图11.4所示。
import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; public class DrawOvals extends Applet { public void paint(Graphics g) { g.setColor(Color.red); g.drawOval(35,35,100,60); g.setColor(Color.blue); g.fillOval(200,15,60,100); } }

14 图 11.4

15 例11.5 用drawArc和fillArc方法分别画圆弧,结果如图11.5所示。 图 11.5
圆弧 例11.5 用drawArc和fillArc方法分别画圆弧,结果如图11.5所示。 图 11.5

16 import java.applet.Applet;
import java.awt.Graphics; import java.awt.Color; public class DrawArcs extends Applet { public void paint(Graphics g) { g.setColor(Color.red); g.drawArc (0,20,100,100,0,90); g.fillArc (180,20,100,100,90,90); g.fillArc (50,40,100,100,180,90); g.drawArc (130,40,100,100,0,-90); } }

17 drawArc方法可画圆弧,fillArc方法实际画出的是扇形。画圆弧的方法比画椭圆的方法多了两个参数: 起始角和张角(以角度为单位)。起始角确定了圆弧的起始位置,张角确定了圆弧的大小,取正(负)值为沿逆(顺)时针方向画出圆弧。当张角取值大于360时,画出的就是椭圆。

18 11.1.5 多边形 例11.6 用drawPolygon和fillPolygon方法分别画多边形,结果如图11.6所示。
import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; public class DrawPols extends Applet { int p1X[]={20,20,100,20}; int p1Y[]={20,80,20,20}; int p1=3; int p2X[]={280,120,50,90,210,280}; int p2Y[]={20,50,100,110,70,20}; int p2=5;

19 图 11.6 public void paint(Graphics g) { g.setColor(Color.red);
g.fillPolygon (p1X,p1Y,p1); g.drawPolygon (p2X,p2Y,p2); } } 图 11.6

20 多边形的多条边分别用两个整形数组表示X坐标和Y坐标,注意,两个数组中的个数一定要相同,并用一个整形数表示多边形的顶点数,如p1=3。多边形可以是封闭的也可以是开放的,取决于最后一条直线终点坐标的取值,若和第一条直线起点坐标重合,画出的多边形是封闭的,否则就是开放的。

21 11.2 画布 画布的作用 画布(Canvas)是用来绘图的组件,其作用和Windows的画图板类似,操作者可在画布上用鼠标直接画出图形。Canvas继承自Component类,有自己的Paint方法,能响应鼠标和键盘事件。 直接画在窗口区的图形,很容易被其他组件覆盖掉。如果把图形画在画布上,就可解决覆盖问题。画布提供了一块专门的图形区域,通过设定自己的边界而和其他组件区分开,以保护画面不被覆盖。即使画面被破坏,也可以重新恢复,即通过自己的paint方法重画出来。

22 下面是将画布添加到Applet中的例子。 例11.7 编写一个创建画布的简单程序,运行结果如图11.7所示。 图 11.7
创建画布实例 下面是将画布添加到Applet中的例子。 例11.7 编写一个创建画布的简单程序,运行结果如图11.7所示。 图 11.7

23 import java.applet.Applet;
import java.awt.*; import java.awt.Color; public class Canvas1 extends Applet { public void init() { MyCanvas1 c=new MyCanvas1(); c.setBackground(Color.green); c.setSize(300,200); add(c); } class MyCanvas1 extends Canvas { public void paint(Graphics g) { g.setColor(Color.red); g.fillOval(40,20,80,80); }

24 画布对象在创建时没有默认的大小,必须用setSize方法设定画布大小,否则在界面上将看不到画布。程序中的自定义类MyCanvas1是Canvas的子类,重载了Canvas的paint方法,该方法默认时没有任何功能。在画布上绘图,无论是用程序方法还是手工方法必须重载paint方法才能实现。

25 图形方式下的文字输出可实现多种效果。通过设定字体、风格和大小,实现文字输出的多样化。
11.3 文字输出 图形方式下的文字输出可实现多种效果。通过设定字体、风格和大小,实现文字输出的多样化。

26 11.3.1 字符串、字符和字节输出 在Graphics类中,Java提供了3个文字输出方法,分别实现以字符串、字符和字节形式的文字输出。
(1) 字符串输出方法: drawString (String string, int x, int y)。 (2) 字符输出方法: drawChars (char chars[ ], int offset, int number, int x, int y)。 (3) 字节输出方法: drawBytes (byte bytes[ ], int offset, int number, int x, int y)。

27 例11.8 文字输出方法示例,程序运行结果如图11.8所示。 图 11.8

28 import java.applet.Applet;
import java.awt.Graphics; public class ZF1 extends Applet { String s=″This is a string″; char c[]={′这′,′是′,′一′,′个′,′字′,′符′,′数′,′组′}; byte b[]={97,′ ′,′b′,′y′,′t′,′e′,′ ′,97,114,114,97,121}; public void paint(Graphics g) { g.drawString(s,30,30); g.drawChars(c,0,8,30,60); g.drawBytes(b,0,12,30,90); } }

29 3种方法都是以当前字体和颜色在指定位置处输出文字。drawString用于绘制一个字符串,使用时要传递给它3个参数: 要输出的字符串s、x坐标和y坐标。字符串可以是常量也可以是变量。x和y用于指定字符串左下角的位置。 drawChars用于绘制字符型数组。当需要对一串字符采用不同字体或颜色绘制时,这个方法特别适合你。使用时,要分别指定字符数组、字符起始位置、要输出的字符个数、x和y坐标。 drawBytes用于绘制字节型数组,使用方法和drawChars类同。drawChars中的字符数组是16位长的字符类型,可显示Unicode的全部字符;而drawBytes中的字节数组是8位长的有符号字节类型,只能显示ASCII字符集中的前128个字符。

30 字体控制 Java在Font类中实现对字体的控制,可改变字体、风格和大小。字体的数量和计算机平台密切相关,不同计算机上安装的字体差别很大。 Java提供了5种逻辑字体: Dialog、SansSerif、Serif、Monospaced和DialogInput,并将它们映射为计算机上的物理字体。如果使用了计算机不支持的字体,Java将以该计算机的默认字体来代替。

31 例11.9 显示字体风格和大小示例,程序运行结果如图11.9所示。
import java.applet.Applet; import java.awt.*; public class ShowFont extends Applet { Font font1=new Font(″SansSerif″,Font.BOLD,24); Font font2=new Font(″Serif″,Font.PLAIN,20); Font font3=new Font(″Times New Roman″,Font.PLAIN,20); public void paint(Graphics g) { g.setFont(font1); g.drawString(″SansSerif 24 point BOLD″,20,30); g.setFont(font2); g.drawString(″Serif 20 point PLAIN″,20,60); g.setFont(font3); g.drawString(″Times New Roman 20 point PLAIN″,20,90); g.setFont(new Font(″Times New Roman″,Font.ITALIC,20)); g.drawString(″Serif is equal to Times New Roman″,20,120); g.setFont(new Font(″宋体″,Font.PLAIN,14)); g.drawString(″宋体 14 point PLAIN ″,20,140); } }

32 图 11.9

33 改变当前字体时,需要先创建一个Font对象,然后以该实例对象为参数调用setFont方法,这时的文字输出就以新字体显示。
Font的构造方法包含3个参数: String fontName、int style、int size,分别表示字体名称、风格和大小。字体名称可使用逻辑字体名称,也可使用计算机现有的字体名称。例11.10分别使用了逻辑字体SansSerif、Serif和系统字体Times New Roman、宋体。其中,Serif映射了Times New Roman,二者是同一种字体。 字体有3种风格,BOLD(加重)、ITALIC(倾斜)和PLAIN(正常)。字体大小可任选一个整数。

34 11.4 颜色控制 Java在Color类中实现对颜色的控制,可改变前景色和背景色。Java将常用颜色定义为颜色常量,如表11.1所示。
此外,程序员还可以通过调配三原色的比例创建自己的Color对象。Color类有以下几种常用构造方法: • Color(float r,float g,float b) 指定三原色的浮点值,每个参数取值在0.0~1.0之间。 • Color(int r,int g,int b) 指定三原色的整数值,每个参数取值在0~255之间。 • Color(int rgb) 指定一个整型数代表三原色的混合值,16~23位代表红色,8~15位代表绿色,0~7位代表蓝色。

35 表11.1 常用颜色表 颜色常量 色彩 RGB值 black 黑色 (0, 0, 0) blue 蓝色 (0, 0, 255) cyan
青色 (0, 255, 255) darkGray 深灰色 (64, 64, 64) gray 灰色 (128, 128, 128) green 绿色 (0, 255, 0) lightGray 浅灰色 (192, 192, 192) magenta 洋红色 (255, 0, 255) orange 橙色 (255, 200, 0) pink 粉红色 (255, 17, 175) red 红色 (255, 0, 0) white 白色 (255, 255, 255) yellow 黄色 (255, 255, 0)

36 11.4.1 为不同对象设置颜色 例11.10 颜色设置示例,程序运行结果如图11.10所示。
import java.applet.Applet; import java.awt.*; import java.awt.Color; public class ColorDemo extends Applet { int red, green, blue; String s; public void init() { s=getParameter(″red″); if (s!=null) red=Integer.parseInt(s); s=getParameter(″green″);

37 green=Integer.parseInt(s);
s=getParameter(″blue″); if (s!=null) blue=Integer.parseInt(s); Color c=new Color(red, green, blue); setBackground(c); setForeground(Color.white); } public void paint(Graphics g) { g.fillOval(50,25,300,100); g.setColor(Color.blue); g.setFont(new Font(″宋体″,Font.ITALIC,18)); g.drawString(″通过 HTML 文件传递颜色参数,设定颜色″,40,80); }

38 图 11.10

39 其中的value值可随时修改,相应地就改变了Applet的背景色。注意: HTML的参数名和值都是字符串类型,要进行相应的转换。
ColorDemo采取了特殊方法获取颜色值。在init方法中,通过getParameter方法读取HTML传递的参数,参数值即为设定的颜色值。这样做的好处是可在程序外面改变颜色而不必重新编译程序,修改HTML文件要比修改程序再重新编译简单得多,只需要在HTML文件中加入以下代码即可: <PARAM name=red value=128> <PARAM name=green value=255> <PARAM name=blue value=128> 其中的value值可随时修改,相应地就改变了Applet的背景色。注意: HTML的参数名和值都是字符串类型,要进行相应的转换。

40 例11.11 输出一个字符串,其中每个字符都以不同的颜色显示,程序运行结果如图11.11所示。 图 11.11
不同颜色的文字 例11.11 输出一个字符串,其中每个字符都以不同的颜色显示,程序运行结果如图11.11所示。 图 11.11

41 import java.applet.Applet;
import java.awt.*; import java.awt.Color; public class ColorString extends Applet { char c[]={′一′,′个′,′彩′,′色′,′字′,′符′,′串′}; int red,green,blue; public void paint(Graphics g) { g.setFont(new Font(″宋体″,0,40)); for (int i=0;i<7;i++) { red=(int)(Math.random()*255); green=(int)(Math.random()*255); blue=(int)(Math.random()*255); g.setColor(new Color(red,green,blue)); g.drawChars(c,i,1,20+i*40,80); } }

42 11.5 图像处理 图像与几何图形是有区别的。图形可以由程序画出来,而图像则是由专用软件生成的二进制文件,按不同格式存储图像数据就形成了不同的图像种类。Java支持两种图像格式JPEG和GIF。

43 图像种类 图像一般用扫描仪配合图像处理软件制作成图像格式文件。图像的最终表达决定于屏幕像素点的颜色,即不同像素点取不同颜色就可以显示一幅图像。让哪一个像素点取何种颜色就是图像格式文件的任务。图像格式文件的扩展名代表着图像格式,也代表着图像还原处理方法。在进行图像处理之前,先来了解一点常用图像格式的基本知识。

44 1. BMP BMP是Windows的标准位图文件格式,含有固定数量的像素点颜色,可用Windows的画图程序打开。这种图像在放大时,会出现锯齿边缘,变得很不清晰。图像文件没有被压缩过,规模较大,不适合在Internet上使用,Java不能显示这种图像。

45 2. JPEG或JPG JPEG称为联合图像专家组(Joint Photographic Experts Group),可用浏览器打开。JPEG(或JPG)图像格式一般用来显示照片和具有连续色调的图像,它能保存图像所有颜色信息。JPEG是一种压缩的文件格式,在打开时自动解压缩。由于压缩后的文件规模较小,成为Internet上广泛使用的图像格式,Java可以显示这种图像。

46 3. GIF GIF称为图像交换格式(Graphic Interchange Format),可用浏览器打开。GIF图像是一种压缩文件格式,由于它能最大限度地减少文件转换时间,所以在HTML文件中常用于显示插图或图标。GIF格式能有效减少文件大小,有利于在Internet上使用,Java支持这种图像格式。

47 例11.12 在Applet中显示一幅图像,如图11.12所示。 图 11.12
图像的显示 例11.12 在Applet中显示一幅图像,如图11.12所示。 图 11.12

48 import java.applet.Applet;
import java.awt.Image; import java.awt.Graphics; public class DMT1 extends Applet { Image img; public void init(){ img=getImage(getCodeBase(),″Water.JPG″); } public void paint(Graphics g){ g.drawImage(img,30,10,this); }

49 从本例可知,图像显示分为两个步骤: 首先加载图像(即将图像文件Water
从本例可知,图像显示分为两个步骤: 首先加载图像(即将图像文件Water.JPG读入内存),然后画出图像。程序创建了一个Image对象img,通过Applet的getImage方法加载图像文件Water.JPG,将它和img联系起来,然后通过Graphics的drawImage方法显示图像。 注意: getCodeBase返回的是Applet文件所在的地址,即该文件所在的目录,这里要把显示的图像文件和Applet文件放在同一个目录下,这样才能保证程序找到该图像文件。另外,使用getDocumentBase方法可返回调用Applet文件的HTML文件所在的地址,也可以达到同样目的。

50 图像的缩放显示 如果要缩放图像的大小,又要不使图像因缩放而变形失真,可将原图的宽度和高度按相同的比例进行缩放。只需调用Image的两个getWidth和getHeight方法就可以得到原图的宽度和高度。

51 例11.13 图像的缩放显示,如图11.13所示。 图 11.13

52 import java.awt.*; import java.applet.*; public class ShowImage1 extends Applet { Image img; public void init(){ img=getImage(getCodeBase(),″铃.jpg″); } public void paint(Graphics g){ int w=img.getWidth(this); int h=img.getHeight(this); g.drawImage(img,20,40,this); // 原图 g.drawImage(img,120,70, w/2, h/2, this); // 缩小一倍 g.drawImage(img,160,0, w*2, h*2, this); // 放大一倍 }

53 11.6 动画处理 动画是指连续而平滑地显示的多幅图像。动画的质量一方面取决于图像的质量,另一方面则取决于平滑程度。在计算机上,以10~30幅/每秒钟的速度显示图像即可达到满意的动画质量。在Java中实现动画是十分简单的事情。

54 动画原理 计算机动画原理十分简单,首先在屏幕上显示出第一帧画面,过一会儿把它擦掉,然后再显示下一帧画面,如此循环往复。由于人眼存在着一个视觉差,所以感觉好像画面中的物体在不断运动。

55 例11.14 创建一个空中跳伞动画,如图11.14所示。 图 11.14

56 import java.awt.*; import java.applet.*; public class DMT6 extends Applet { Image t1, t2; int x=10; public void init() { t1=getImage(getCodeBase(),″image/天空.JPG″); t2=getImage(getCodeBase(),″image/伞.gif″); } public void paint(Graphics g) { g.drawImage(t1,0,0,this); g.drawImage(t2,210-x,x,this); try { Thread.sleep(50); x+=5;

57 覆盖update方法可以降低闪烁,但不能消除它。
if (x==210) { x=5; Thread.sleep(1000); } } catch (InterruptedException e) {} repaint(); } 一般来说,画面越大,update以背景色清除显示区所占用的时间就越长,不可避免地会产生闪烁。为了达到平滑而又没有闪烁的动画效果,就应该考虑采取一些补救措施。 覆盖update方法可以降低闪烁,但不能消除它。

58 11.6.2 用线程实现动画 在Java中出于网络实用的目的,主要使用独立线程来实现动画。
例11.15 用独立线程连续显示一个图像序列,如图11.15所示。 图 11.15

59 import java.awt.*; import java.applet.*; public class DMT8 extends Applet implements Runnable { Image img[]=new Image[10]; Image buffer; Graphics gContext; Thread animate; int index=0; public void init() { buffer=createImage(getWidth(),getHeight()); gContext=buffer.getGraphics(); for (int i=0;i<10;i++) img[i]=getImage(getCodeBase(),″image/″+″T″+(i+1)+″.JPG″); } public void start() {

60 if (animate==null) { animate=new Thread(this); animate.start(); } public void stop() { if (animate!=null) animate=null; public void run() { while(true) { gContext.drawImage(img[index],100,20,this); repaint(); try { animate.sleep(50); } catch (InterruptedException e) {} gContext.clearRect(100,20,100,100);

61 index=++index%10; } public void paint(Graphics g) { g.drawImage(buffer,0,0,this); public void update(Graphics g) { paint(g); }

62 本程序加载了10个图像(T1.JPG~T10.JPG),它们分别显示小球不同时间的高度和状态,存放在“程序/image”目录下。程序采用了图形双缓冲技术,实现了Runnable接口中的run方法,这是一个和Applet同时运行的线程。对线程的控制由Applet的start和stop方法完成,Applet运行时,就在start方法中启动线程;Applet停止时,就在stop方法中停止线程。运行程序时可以看到小球在不停地跳动。

63 对图像的操作全部放在run方法的永恒循环当中。首先调用gContext的drawImage方法把当前图像画在屏幕缓冲区内,然后在paint方法中把屏幕缓冲区复制到屏幕上。但paint方法一般无法直接调用,因为要传递给它一个图形参数g,所以通过调用repaint方法来间接调用paint以完成屏幕复制。repaint方法无参数,它将调用update方法,由update方法调用paint方法并传递g参数。这就是曾介绍过的一个线程负责准备图像而另一个线程负责显示图像的动画方法。接下来,线程休眠50毫秒,然后清除屏幕缓冲区中的图像,将图像下标加1并取模。如果不清除屏幕缓冲区中的图像,将会出现图像重叠。下标加1后求余数,可保证取值范围总是0~9。

64 11.7 加载声音文件 Java开发工具SDK比以前版本支持更多的声音格式,常用的有5种: AIFF、AU、WAV、MIDI和RMF。音质可为8位或16位的单声道和立体声,采样频率从8~48 kHz。当然音质越好占用的资源就越多,网络下载时间就越长。对于面向网络的Applet来说,必须考虑声音文件的大小,需要在音质和文件大小之间采取折中办法。

65 11.7.1 添加背景音乐 在Applet中播放声音十分简单,加载声音文件,然后调用play方法播放即可。
例11.16 在程序中添加背景音乐。 import java.awt.*; import java.applet.*; public class DMT9 extends Applet { public void init() { play(getDocumentBase(),″WAV/Sound.wav″); //播放声音文件 } }

66 当运行该程序时可同时听到背景音乐Sound.wav ,该文件存放在Applet同一个目录下的WAV子目录中。也可采用如下调用格式来播放:
play(getCodeBase( ), ″WAV/Sound.wav″); 一旦play方法加载了该声音文件,就立即播放。如果找不到指定的声音文件,不会产异常,只是听不到声音而已。然而,这种播放是一次性的,若要重播必须重新加载声音文件。

67 随时播放声音文件 如果想把一个声音文件作为背景音乐随时播放,需要引入功能更强的AudioClip类,它包含在java.applet类库中,在编写程序中要引入java.applet.AudioClip。

68 例11.17 本地计算机工作目录“E:\JAVA\程序\WAV”下有5个声音文件,代表了5种声音格式,编写加载并播放这些声音文件的源程序,运行结果如图11.16所示。
import java.awt.*; import java.awt.event.*; import java.applet.Applet; import java.applet.AudioClip; public class DMT10 extends Applet implements ItemListener, ActionListener { AudioClip sound; Choice c=new Choice();  Button play=new Button(″播放″); Button loop=new Button(″连续″); Button stop=new Button(″停止″); public void init() { c.add(″space.au″); c.add(″flute.aif″); c.add(″trip.mid″);

69 c.add(″jungle.rmf″); c.add(″Sound.wav″);
add(c); c.addItemListener(this); add(play); add(loop); add(stop);  play.addActionListener(this); loop.addActionListener(this); stop.addActionListener(this); sound=getAudioClip(getCodeBase(), ″WAV/″+″Sound.wav″); } public void itemStateChanged(ItemEvent e) { sound.stop(); sound=getAudioClip(getCodeBase(), ″WAV/″+c.getSelectedItem()); public void actionPerformed(ActionEvent e) { if (e.getSource()==play) sound.play(); else if (e.getSource()==loop) sound.loop(); else if (e.getSource()==stop) sound.stop(); }

70 图 11.16

71 上述程序使用下拉式列表显示5个声音文件,用户可从中任意选择一个来播放,并用按钮来控制播放方式。程序添加了一个AudioClip对象sound,一个下拉式列表c和3个按钮,实现了选项事件监听接口和动作事件监听接口。 在init方法中,添加了全部子对象,并注册了各自的事件监听者,最后加载了第一个声音文件Sound.wav,将对象引用赋给sound。在选项事件处理方法中,首先停止当前声音文件的播放,然后根据用户的选择加载声音文件,并将对象引用赋值给sound。

72 在按钮事件处理方法中,首先取得事件源,然后根据事件源的判断结果分别调用sound对象的相应方法。单击“播放”按钮时,调用play方法播放用户选择的声音文件,播放完毕就自动停止。单击“连续”按钮时,调用loop方法连续播放用户选择的声音文件,此方法不能自动停止。单击“停止”按钮时,调用stop方法停止播放。 此外,用户可以从下拉式列表中多次选择声音文件,单击“播放”或“连续”按钮就可实现混合播放。 在程序中创建了AudioClip类的对象sound,对其实例化后声音文件即被加载,可调用它的方法处理声音文件。如果该方法没有找到指定的声音文件,将返回null值,此时不能引用所创建的对象。

73 AudioClip类只有3个方法: void play() 播放一遍 void loop() 连续播放 void stop() 停止播放 如果只想播放一次,可调用play方法,也可在程序中通过循环调用play方法来控制播放次数。loop方法可实现连续播放,但无法控制播放次数。stop方法用来停止正在播放的声音剪辑。如果需要的话,可以加载多个声音文件一起播放,这些声音将混合起来,就像多重奏一样。 由上面的介绍可知: Java提供了两种播放声音的方式: 一种是通过Applet类的play方法;一种是通过AudioClip类中的方法来播放。

74 习题 11-1 编写一个绘制5个同心圆的程序,分别使用drawOval和drawArc方法。
11-3 编写一个绘制五角星的程序,使用drawPolygon方法。 11-4 编写一个Applet程序,显示一个字符串,用两个按钮控制字符串的放大和缩小。 11-5 编写一个Applet程序,用不同的字体大小随机显示字符。

75 11-6 编写一个Applet程序,绘制10×10方格。
11-8 编写一个Applet程序,使用fillRect方法输出不同的颜色。 11-9 编写一个能动态移动字符串的程序。 11-10 如何加载和显示一幅图像?如何放大和缩小一幅图像的显示? 11-11 如何生成一幅动画图像?如何消除画面切换时的闪烁? 11-12 何为图形双缓冲技术?编写动画程序时需要注意哪些因素?

76 11-13 准备好一个音乐文件,为前面编写的程序配上背景音乐。
11-14 准备好几个音乐文件和一幅图像,编写一个Applet,显示一幅图像并添加“播放”、“连续”和“停止”按钮随时播放音乐文件。


Download ppt "第11章 图形与多媒体处理 11.1 基本图形 11.2 画布 11.3 文字输出 11.4 颜色控制 11.5 图像处理"

Similar presentations


Ads by Google