chapter09多媒体与图形学程序设计-JavaP_第1页
chapter09多媒体与图形学程序设计-JavaP_第2页
chapter09多媒体与图形学程序设计-JavaP_第3页
chapter09多媒体与图形学程序设计-JavaP_第4页
chapter09多媒体与图形学程序设计-JavaP_第5页
已阅读5页,还剩35页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章 多媒体与图形学程序设计JAVA授课教师:赵小敏浙江工业大学 软件学院Java程序设计第9章 多媒体与图形学程序设计主要内容:一、声音播放二、图像显示三、图形处置四、动画处置一、声音播放1、加载声音文件在Applet中播放声音非常简单,加载声音文件,然后调用play方法播放即可。Java提供了两种播放声音的方式:一种是经过Applet类的play方法,一种是经过AudioClip接口中的方法来播放。Applet的play方法可以将声音文件的加载与播放一并完成,其调用格式如下: void play(URL url) void play(URL url, String

2、name)加载声音文件其中URL是一个网络地址,网络地址假设包含声音文件可采用第一种方式,否那么采用第二种方式,播放本地计算机上的声音文件也可采用第二种方式。假设有一个MIDI声音文件trip.mid和Applet放在同一个目录下,采用如下调用格式即可播放:play(getCodeBase( ),trip.mid);Applet的getAudioClip方法可创建这样的对象,该方法加载指定网络地址的声音文件,并前往一个AudioClip对象,调用格式如下: AudioClip getAudioClip(URL url) AudioClip getAudioClip(URL url, Strin

3、g name)加载声音文件创建AudioClip对象后,声音文件即被加载,可调用它的方法处置声音文件。假设该方法没有找到指定的声音文件,将前往null值,此时不能援用所创建的对象。AudioClip只需3个方法: void play()播放一遍; void loop()延续播放; void stop()停顿播放。在Applet中播放声音本地计算机任务目录下有4个声音文件,代表了.au 、 .mid、 .wav种声音格式,加载并播放这些声音文件。结果如以下图所示:例1程序源码: J_Audio.javaimport java.applet.*;import java.awt.*;import j

4、ava.awt.event.*;import javax.swing.*;public class J_Audio extends JApplet implements ActionListener, ItemListener private AudioClip m_soundFirst, m_soundSecond,m_soundThird, m_soundFourth, m_soundCurrent; private JButton m_buttonPlay, m_buttonLoop, m_buttonStop; private JComboBox m_comboChoose; publ

5、ic void init( ) / Build interfaces and set sounds Container container = getContentPane( ); container.setLayout( new FlowLayout( ) ); String choices = hi, bark,PINBALL,BATTVLOW ; m_comboChoose = new JComboBox( choices ); m_comboChoose.addItemListener( this ); container.add( m_comboChoose ); m_buttonP

6、lay = new JButton( Play ); m_buttonPlay.addActionListener( this ); container.add( m_buttonPlay ); m_buttonLoop = new JButton( Loop ); m_buttonLoop.addActionListener( this ); container.add( m_buttonLoop ); m_buttonStop = new JButton( Stop ); m_buttonStop.addActionListener( this ); container.add( m_bu

7、ttonStop ); / load sounds and set m_soundCurrent m_soundFirst = getAudioClip( getDocumentBase( ), hi.au ); m_soundSecond = getAudioClip( getDocumentBase( ), bark.au ); m_soundThird = getAudioClip( getDocumentBase( ), PINBALL.MID ); m_soundFourth = getAudioClip( getDocumentBase( ), BATTVLOW.WAV ); m_

8、soundCurrent = m_soundFirst; public void stop( ) / Stop playing sound m_soundCurrent.stop( ); public void itemStateChanged( ItemEvent e ) m_soundCurrent.stop( ); switch(m_comboChoose.getSelectedIndex( ) case 0:m_soundCurrent=m_soundFirst;break; case 1:m_soundCurrent=m_soundSecond;break; case 2:m_sou

9、ndCurrent=m_soundThird;break; case 3:m_soundCurrent=m_soundFourth;break; default:m_soundCurrent=m_soundFirst;break; public void actionPerformed(ActionEvent e) if ( e.getSource( ) = m_buttonPlay ) m_soundCurrent.play( ); else if ( e.getSource( ) = m_buttonLoop ) m_soundCurrent.loop( ); else if ( e.ge

10、tSource( ) = m_buttonStop ) m_soundCurrent.stop( ); / End of method: actionPerformed 二、图像显示Java支持两种图像格式JPEG和GIF。JPEG称为结合图像专家组joint photographic experts group,可用阅读器翻开。JPEG或JPG图像格式普通用来显示照片和具有延续颜色的图像,它能保管图像一切颜色信息。JPEG是一种紧缩的文件格式,在翻开时自动解紧缩。GIF称为图像交换格式graphic interchange format,可用阅读器翻开。GIF图像是一种紧缩文件格式,由于它能

11、最大限制地减少文件转换时间,所以在HTML文件中常用于显示插图或图标。GIF格式能有效减少文件大小,有利于在Internet上运用,Java支持这种图像格式。1、加载图像加载图像普通放在初始化方法init中进展。程序中的getImage方法可加载Java支持的图像文件,它有两个参数,一个是图像文件地址,一个是图像文件称号。由于Applet是面向网络的,因此图像文件的存储位置并不局限于本地计算机的磁盘目录,大部分情况是直接读取Web效力器上的图像文件。Java.applet.Applet的成员getImage方法前往一个Image对象,它的调用格式为: Image getImage(URL ur

12、l) Image getImage(URL url, String name)2、显示图像显示图像需求调用Graphics类的方法drawImage,它可以将Image对象关联的图像显示在Applet的指定位置。drawImage方法的调用格式如下: boolean drawImage(Image img, int x, int y, ImageObserver observer) boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)2、显示图像其中img就是要显示的图像、x和y是图像

13、显示位置x和y可取负值,表示一部分图像被移出了显示区、bgcolor是图像显示区域的背风光、observer是图像加载跟踪器,通常将该参数指定为this,即由Applet担任跟踪图像的加载情况。这两种方法都是将图像照原样显示,能不能对图像进展缩放呢?运用下面两种调用格式就可以对图像进展缩放显示: boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) boolean drawImage(Image img, int x, int y, int w, int h, Colo

14、r c, ImageObserver observer)例2:显示图像import java.awt.*;import javax.swing.*;public class J_Image extends JApplet Image m_image = new Image2; public void init( ) m_image0= getImage(getCodeBase( ), ts1.gif); m_image1= getImage(getCodeBase( ), ts2.gif); / End of method: init public void paint(Graphics g)

15、 g.drawImage(m_image0, 0, 0, 150, 150, this); g.drawImage(m_image1, 150, 0, 150, 150, this); g.drawImage(m_image0, 0, 150, 300, 150, this); / End of method: paint / End of class: J_Image运转结果3、幻灯机效果假设Applet 仅仅是显示一幅图像,没有什么特别的意义,不如直接在HTML文件中显示图像。Applet应该做HTML做不到的事情,例如像幻灯机那样延续显示图像。多幅图像的显示,如以下图:例3:多幅图像的显

16、示import java.awt.*;import java.awt.event.*;import java.applet.*;public class ShowDoggy extends Applet int index; Image imgs=new Image14; public void init() addMouseListener(new MouseAdapter() public void mouseClicked(MouseEvent e) index=+index%6; repaint(); ); for (int i=0; i14; i+) imgsi=getImage(g

17、etCodeBase(),doggy/T+i+.gif); public void paint(Graphics g) if (imgsindex!=null) g.drawImage(imgsindex,20,20,this); 三、图形处置根本的图形类:Color类:包含控制颜色的方法和常量Font类:包含控制字体的方法和常量Polygon类:包含创建多边形的方法Graphis类:包含了绘制字符串、线条、矩形及其它外形的方法Rectangle类:用来绘制矩形java.awt.geom.CubicCurve2D.Double类:画抛物线java.awt.geom.Arc2D.Double 类

18、:画圆弧java.awt.geom.Ellipse2D.Double 类:画椭圆图形环境和图形对象在java中,图形环境使得可以在屏幕上绘图,对各种图形的显示经过类Graphics和Graphics2D来完成。Graphics对象包含了绘图方法,字体控制和颜色控制等Component类的paint方法以一个Graphics对象作为参数,在Component执行paint操作时,系统将Graphics对象传送给paint方法。 public void paintGraphics g颜色控制Java API提供Color类定义颜色的方法和常量。每种颜色都是由红、绿和篮三种颜色组成,称为RGB值。一

19、个RGB值由三个部分,是0255的整数或0.01.0的浮点数。RGB值越大,相应颜色的含量越大。例4:运用几种不同的颜色绘制填充矩形和字符串字体控制Java API提供Font类定义字体的方法和常量。Font类的构造函数有三个参数:字体称号、字体风格和字体大小。字体称号可以是运转程序的系统所支持的任何一种字体,如Java字体Monospaced,SansSerif和Serif字体风格可以是Font.PLAIN,Font.ITALIC和Font.BOLD,字体风格可以组合运用,如Font.ITALICFont.BOLD字体大小是以点来衡量的,一个点是1/21英寸留意:制定一个系统不存在的字体是一

20、种逻辑错误。例5:显示4种不同大小、不同字体的文本 public void paint( Graphics g ) g.setFont( new Font( Serif, Font.BOLD, 12 ) ); g.drawString( Serif 12 point bold., 20, 50 ); g.setFont( new Font( Monospaced, Font.ITALIC, 24 ) ); g.drawString( Monospaced 24 point italic., 20, 70 ); g.setFont( new Font( SansSerif, Font.PLAIN

21、, 14 ) ); g.drawString( SansSerif 14 point plain., 20, 90 ); g.setColor( Color.red ); g.setFont( new Font( Serif, Font.BOLD + Font.ITALIC, 18 ) ); g.drawString( g.getFont().getName() + + g.getFont().getSize() + point bold italic., 20, 110 ); 画线、矩形和椭圆例6:线、矩形、3D矩形、圆角矩形和椭圆的绘制。public void paint( Graphic

22、s g ) g.setColor( Color.red ); g.drawLine( 5, 30, 350, 30 ); g.setColor( Color.blue ); g.drawRect( 5, 40, 90, 55 ); g.fillRect( 100, 40, 90, 55 ); g.setColor( Color.cyan ); g.fillRoundRect( 195, 40, 90, 55, 50, 50 ); g.drawRoundRect( 290, 40, 90, 55, 20, 20 ); g.setColor( Color.yellow ); g.draw3DRec

23、t( 5, 100, 90, 55, true ); g.fill3DRect( 100, 100, 90, 55, false ); g.setColor( Color.magenta ); g.drawOval( 195, 100, 90, 55 ); g.fillOval( 290, 100, 90, 55 ); 画圆弧弧形是椭圆的一部分,弧的角度以度来衡量。例7:演示drawArc和fillArc。 public void paint( Graphics g ) / start at 0 and sweep 360 degrees g.setColor( Color.yellow );

24、 g.drawRect( 15, 35, 80, 80 ); g.setColor( Color.black ); g.drawArc( 15, 35, 80, 80, 0, 360 ); / start at 0 and sweep 110 degrees g.setColor( Color.yellow ); g.drawRect( 100, 35, 80, 80 ); g.setColor( Color.black ); g.drawArc( 100, 35, 80, 80, 0, 110 ); / start at 0 and sweep -270 degrees g.setColor

25、( Color.yellow ); g.drawRect( 185, 35, 80, 80 ); g.setColor( Color.black ); g.drawArc( 185, 35, 80, 80, 0, -270 ); / start at 0 and sweep 360 degrees g.fillArc( 15, 120, 80, 40, 0, 360 ); / start at 270 and sweep -90 degrees g.fillArc( 100, 120, 80, 40, 270, -90 ); / start at 0 and sweep -270 degree

26、s g.fillArc( 185, 120, 80, 40, 0, -270 ); 例8:画多边形和折线 public void paint( Graphics g ) int xValues = 20, 40, 50, 30, 20, 15 ; int yValues = 50, 50, 60, 80, 80, 60 ; Polygon poly1 = new Polygon( xValues, yValues, 6 ); g.drawPolygon( poly1 ); int xValues2 = 70, 90, 100, 80, 70, 35, 60 ; int yValues2 = 1

27、00, 100, 110, 110, 130, 110, 90 ; g.drawPolyline( xValues2, yValues2, 7 ); int xValues3 = 120, 140, 150, 190 ; int yValues3 = 40, 70, 80, 60 ; g.fillPolygon( xValues3, yValues3, 4 ); Polygon poly2 = new Polygon(); poly2.addPoint( 165, ); poly2.addPoint( 175, 150 ); poly2.addPoint( 270, 200 ); poly2.

28、addPoint( 200, 220 ); poly2.addPoint( 130, 180 ); g.fillPolygon( poly2 ); 结果显示(70,100)(90,100)(100,110)(80,110)(70,130)(65,110)(60,90)Java2D APIJava2D API提供绘制复杂图形的二维图形功能类,详细在以下包中:java.awt.*java.awt.image.*java.awt.color.*java.awt.font.*java.awt.geom.*java.awt.print.*java.awt.image.renderableJava2D图形

29、java.awt.geom包中提供一些Java2D图形功能的类,包括Ellipse2D.Double, Rectangle2D.Double, RoundRectangle2D.Double,Arc2D.Double和Line2D.Double等。例9:演示几种Java2D图形和绘制的特性例10:绘制五角星四、动画处置游戏软件的设计中,动画向程序员提出了挑战,但在Java中实现动画那么是非常简单的事情。下面让我们一同由浅入深地编写几个动画程序实例,并经过对这些实例的逐渐改良来讨论Java动画技术的关键。1、动画原理计算机动画原理非常简单,首先在屏幕上显示出第一帧画面,过一会儿把它擦掉,然后再显

30、示下一帧画面,如此循环往复。由于人眼存在着一个视觉差,所以觉得好似画面中的物体在不断运动。例11:宇宙飞船游太空import java.awt.*;import java.applet.*;public class MovingImg extends Applet Image star, rocket; int x=0; public void init() star=getImage(getCodeBase(),starfield.gif); rocket=getImage(getCodeBase(),rocketship.gif); public void paint(Graphics g

31、) g.drawImage(star,0,0,this); g.drawImage(rocket,x,15,this); try Thread.sleep(30); x+=5; if (x=400) x=0; Thread.sleep(600); catch (InterruptedException e) repaint(); 程序分析1这是一个很简单的动画,在Applet中有一个充任太空的背景图,一艘宇宙飞船在太空图上不断从左边挪动到右边。程序中创建了两个Image对象star和rocket,在init方法中分别加载了两个图像文件和这两个对象关联起来。添加了变量x用来指定飞船的画出位置,x

32、初始化为10。在paint方法中,留意到太空总是画在指定位置0, 0,而飞船那么画在位置x, 15,其中x的值是不断变化的。程序分析2真正使飞船实现动画效果是在try.catch块中。paint方法的最后一条语句是调用repaint方法。repaint方法的功能是重画图像,它先调用update方法将显示区清空,再调用paint方法画出图像。这就构成了一个循环,paint调用了repaint,而repaint又调用了paint,使飞船不延续地来回挪动。运转这个Applet时,画面有闪烁景象。普通来说,画面越大,update以背风光去除显示区所占用的时间就越长,不可防止地会产生闪烁。为了到达平滑而

33、又没有闪烁的动画效果,就应该思索采取一些补救措施。覆盖update方法可以降低闪烁,但不能消除它。能有效消除闪烁的方法是采用图形双缓冲技术graphics double buffering。2、图形双缓冲技术import java.awt.*;import java.applet.*;public class MovingImg extends Applet Image star, rocket, buffer; Graphics gContext; int x=10; public void init() star=getImage(getCodeBase(),starfield.gif);

34、 rocket=getImage(getCodeBase(),rocketship.gif); buffer=createImage(getWidth(),getHeight(); gContext=buffer.getGraphics(); public void paint(Graphics g) gContext.drawImage(star,0,0,this); gContext.drawImage(rocket,x,15,this); g.drawImage(buffer,0,0,this); try Thread.sleep(10); x+=2; if (x=400) x=10;

35、Thread.sleep(1000); catch (InterruptedException e) repaint(); public void update(Graphics g) paint(g); 例12:改良后的宇宙飞船游太空3、用线程实现动画例12用图形双缓冲改善了图像闪烁问题,但仍存在一些其他问题。例如用户分开网页后,嵌入的Applet会继续运转,占用CPU时间。下面的例13出于网络适用的目的,采用独立线程实现动画。import java.awt.*;import java.applet.*;public class Running extends Applet implements Runnable Image img=new Ima

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论