《第20章动画——图形界面综合应用.ppt》由会员分享,可在线阅读,更多相关《第20章动画——图形界面综合应用.ppt(25页珍藏版)》请在三一办公上搜索。
1、第20章 动画图形界面综合应用,能力目标:能编写“气球飘飘”程序,定时播放若干个大小不等的彩色椭圆。能编写图像幻灯片程序,并结合多线程,设定时间间隔自动放映。能编写“空中飞翔”动画程序,并能设定间隔时间以控制放映的速度,还能手工定格动画画面。,内容介绍,20.1 任务预览20.2 气球飘飘20.3 图像幻灯片20.4 动画20.5 本章小结20.6 实训20:编写动画程序,20.1 任务预览,本章实训程序运行结果:,20.2 气球飘飘,【例20-1】编写在窗框绘制椭圆的程序,要求在窗框上绘制10个彩色椭圆,各椭圆大小和位置不一,但最大不超过窗框尺寸的五分之一,并且各椭圆的色彩不尽相同。分析:各
2、椭圆位置和大小不一,色彩不一,涉及到随机数问题。,class Frame1 extends JFrame/窗框类Random rand=new Random();/随机对象public Frame1()this.setTitle(随机绘制10个彩色椭圆);this.setBounds(100,100,300,250);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);public void paint(Graphics g)/绘制方法 int width,height;/窗框宽、高 width=t
3、his.getWidth();height=this.getHeight();g.setColor(Color.WHITE);g.fillRect(0,0,width,height);int x,y,w,h;Color color;/椭圆左、上、宽、高与颜色 for(int i=1;i=10;i+)x=rand.nextInt(width);y=rand.nextInt(height);w=rand.nextInt(width/5);h=rand.nextInt(height/5);color=new Color(rand.nextInt(256),rand.nextInt(256),rand
4、.nextInt(256);g.setColor(color);g.drawOval(x,y,w,h);,【例20-2】编写“气球飘飘”程序:在窗框中每隔一定时间(如半秒)随机产生10个模拟气球的实心椭圆。,各气球大小、位置和色彩不一,最大不超过窗框尺寸的五分之一。本例代码绝大部分与例20-1相同。,class Frame2 extends JFrame/窗框类Random rand=new Random();/随机对象public Frame2()/构造方法public void paint(Graphics g)/绘制方法 int width,height;/窗框宽、高 int x,y,w
5、,h;/椭圆左、上、宽、高 for(int i=1;i=10;i+)/循环10次 x=rand.nextInt(width);color=new Color(rand.nextInt(256),);/颜色随机 g.setColor(color);g.fillOval(x,y,w,h);try Thread.sleep(500);/休眠500毫秒,即半秒 catch(InterruptedException e)this.repaint();/重绘,运用多线程编写“气球飘飘”程序,修改例20-2代码:class Frame2 extends JFrame implements Runnable.
6、public void run()/线程运行方法 while(true)try Thread.sleep(500);/休眠500毫秒,即半秒 catch(InterruptedException e)this.repaint();/重绘 public void paint(Graphics g)./去掉sleep和repaint语句public class Example2/主类public static void main(String args)Frame2 frame=new Frame2();Thread thread=new Thread(frame);/构建线程 thread.st
7、art();,20.3 图像幻灯片,【例20-3】编写图像幻灯片程序,运行时循环放映6幅存放在文件中的图像。说明:为方便编程,各个图像文件统一格式命名,如命名为child0.jpgchild5.jpg,并放在图像文件夹images中。在Eclipse环境中编程,把images放在项目的根目录中。不能直接显示图像文件,必须构建6个图像对象。使用数组来存放。,class Frame3 extends JFrame/窗框类Image imgs=new Image6;/构建图像数组int index=0;/数组索引public Frame3()/构造方法public void initialize()
8、/初始化方法 for(int i=0;i6;i+)imgsi=Toolkit.getDefaultToolkit().createImage(images/child+i+.jpg);public void paint(Graphics g)/绘制方法 g.setColor(Color.WHITE);g.fillRect(0,0,this.getWidth(),this.getHeight();g.drawImage(imgsindex,10,40,120,150,this);try Thread.sleep(500);/休眠500毫秒 catch(InterruptedException e
9、)index+;if(index=6)index=0;/索引循环 this.repaint();,【例20-4】编写可控制的图像幻灯片程序,通过工具栏的5个按钮“放映”、“停止”、“定时”、“上翻”和“下翻”,以控制图像的放映状态。,class Frame4 extends JFrame/窗框类JToolBar toolBar=new JToolBar(工具栏);JButton buttonPlay=new JButton(放映);JButton buttonStop=new JButton(停止);JButton buttonTime=new JButton(定时);JButton butt
10、onUp=new JButton(上翻);JButton buttonDwon=new JButton(下翻);,Image imgs=new Image6;/构建图像数组int index=0;int time=500;MyCanvas canvas=new MyCanvas();/自定义的画布Thread thread;boolean stopFlag=true;public Frame4()/构造方法public void initialize()/初始化方法 for(int i=0;i6;i+)imgsi=Toolkit.getDefaultToolkit().createImage(
11、images/child+i+.jpg);buttonPlay.addActionListener(new ActionHandler();toolBar.add(buttonPlay);this.add(toolBar,BorderLayout.NORTH);this.add(canvas,BorderLayout.CENTER);buttonStop.setEnabled(false);/初始禁用“停止”按钮,/按钮动作事件监听处理类(内部类):class ActionHandler implements ActionListener public void actionPerformed
12、(ActionEvent e)if(e.getSource()=buttonPlay)thread=new Thread(canvas);/构建线程stopFlag=false;buttonPlay.setEnabled(false);/禁用“放映”按钮buttonStop.setEnabled(true);/启用“停止”按钮thread.start();/启动线程 else if(e.getSource()=buttonStop)/若是“停止”按钮stopFlag=true;/设置停止标记thread=null;buttonPlay.setEnabled(true);/启用“放映”按钮but
13、tonStop.setEnabled(false);/禁用“停止”按钮,else if(e.getSource()=buttonTime)/若是“定时”按钮String str=JOptionPane.showInputDialog(请设定每幅图的放映时间(单位:毫秒),time);if(str=null)return;/若输入框按了“取消”按钮try int t=Integer.parseInt(str);if(t0)throw new Exception(警告:请输入正整数!);time=t;catch(Exception ex)JOptionPane.showMessageDialog(
14、null,ex.getMessage();else if(e.getSource()=buttonUp)/若是“上翻”按钮index-;if(index=-1)index=5;/索引循环canvas.repaint();else if(e.getSource()=buttonDwon)/若是“下翻”按钮index+;if(index=6)index=0;/索引循环canvas.repaint();,/自定义画布类(内部类),该类与线程关联:class MyCanvas extends Canvas implements Runnable public void paint(Graphics g
15、)/绘制方法 g.setColor(Color.WHITE);g.fillRect(0,0,this.getWidth(),this.getHeight();g.drawImage(imgsindex,10,10,120,150,this);public void run()/线程运行方法 while(true)if(stopFlag)break;/停止放映try Thread.sleep(time);catch(InterruptedException e)index+;if(index=6)index=0;/索引循环this.repaint();/执行paint方法重绘,20.4 动画,动
16、画:活动的图画。在屏幕上显示第一帧图片,隔一小段时间如24分之一秒(约42毫秒)再显示下一帧图片,如此循环往复。定时刷新椭圆“气球”、自动放映图像,都可以说是动画,因为画面不断在“动”。程序可实现动画。最简单动画是图像沿着一条固定轨迹作直线运动。为了渲染气氛,可以使用一个背景图作衬托。,20.4.1 窗框实现动画,【例20-5】编写“空中飞翔”动画程序:蓝天白云背景下,一个飞鸟从窗框右下角向左上角飞去,越飞越远,图像越来越小,消失后,下一飞鸟重复飞翔过程。分析:只需使用两个图像文件,一作背景,二是飞鸟(前景)。两个文件可放在Eclipse项目根目录的images目录。飞鸟往左上角方向运动越来越
17、小,只需不断减少图像的显示尺寸便可。为增强飞翔效果,飞鸟使用GIF图像文件。,class Frame5 extends JFrame/窗框类Image backImage,foreImage;/背景图、前景图int x=240,y=240,width=80,height=80;/前景图位置、尺寸public Frame5()/构造方法this.setTitle(简单动画);this.setBounds(100,100,300,300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);initialize();/调用初始化方法this.se
18、tVisible(true);public void initialize()/初始化方法Toolkit toolkit=Toolkit.getDefaultToolkit();backImage=toolkit.createImage(images/cloud.jpg);foreImage=toolkit.createImage(images/flyer.gif);,public void paint(Graphics g)/绘制方法g.drawImage(backImage,0,0,300,300,this);g.drawImage(foreImage,x,y,width,height,t
19、his);try Thread.sleep(42);/休眠42毫秒catch(InterruptedException e)x-=6;y-=6;width-=2;height-=2;/更改前景图位置和尺寸if(x0)x=300;y=300;width=100;height=100;/位置尺寸复位this.repaint();/执行paint方法重绘 public class Example5/主类public static void main(String args)new Frame5();程序没有使用多线程,没有工具栏和按钮。,20.4.2 面板实现动画,【例20-6】改进例20-5的“空
20、中飞翔”动画程序,添加工具栏和5个按钮:“放映”、“停止”、“定时”、“上飞”和“下飞”,控制图像放映状态。class Frame6 extends JFrameJToolBar toolBar=new JToolBar(工具栏);JButton buttonPlay=new JButton(放映);JButton buttonStop=new JButton(停止);JButton buttonTime=new JButton(定时);JButton buttonUp=new JButton(上飞);JButton buttonDwon=new JButton(下飞);int time=42
21、;MyPanel pan=new MyPanel();/自定义面板Thread thread;/线程boolean stopFlag=true;Image backImage,foreImage;int x=150,y=150,width=50,height=50;,public Frame6()/构造方法public void initialize()/初始化方法Toolkit toolkit=Toolkit.getDefaultToolkit();/工具包backImage=toolkit.createImage(images/cloud.jpg);foreImage=toolkit.cr
22、eateImage(images/flyer.gif);buttonPlay.addActionListener(new ActionHandler();buttonStop.addActionListener(new ActionHandler();buttonTime.addActionListener(new ActionHandler();buttonUp.addActionListener(new ActionHandler();buttonDwon.addActionListener(new ActionHandler();toolBar.add(buttonPlay);this.
23、add(toolBar,BorderLayout.NORTH);this.add(pan,BorderLayout.CENTER);buttonStop.setEnabled(false);/初始禁用“停止”按钮,/按钮动作事件监听处理类(内部类):class ActionHandler implements ActionListenerpublic void actionPerformed(ActionEvent e)if(e.getSource()=buttonPlay)/“放映”按钮 thread=new Thread(pan);stopFlag=false;buttonPlay.set
24、Enabled(false);/禁用“放映”按钮 thread.start();/启动线程 else if(e.getSource()=buttonStop)/“停止”按钮 stopFlag=true;thread=null;buttonPlay.setEnabled(true);/启用“放映”按钮 else if(e.getSource()=buttonTime)/“定时”按钮 String str=JOptionPane.showInputDialog(请设定每幅图的放映时间(单位:毫秒),time);if(str=null)return;/若输入框按了“取消”按钮 try int t=I
25、nteger.parseInt(str);if(t0)throw new Exception(警告:请输入正整数!);time=t;catch(Exception ex)showMessageDialog;,else if(e.getSource()=buttonUp)/“上飞”按钮 x-=6;y-=6;width-=2;height-=2;/减少前景图位置和尺寸 if(x300)x=0;y=0;width=0;height=0;/前景图位置和尺寸复位 pan.repaint();/执行面板paint方法重绘,/自定义面板类(内部类),该类与线程关联:class MyPanel extends
26、 JPanel implements Runnable public void paint(Graphics g)/绘制方法 g.drawImage(backImage,0,0,300,300,this);g.drawImage(foreImage,x,y,width,height,this);public void run()/线程运行方法 while(true)if(stopFlag)break;/停止放映 try Thread.sleep(time);/线程休眠 catch(InterruptedException e)x-=6;y-=6;width-=2;height-=2;/减少前景图位置和尺寸 if(x0)x=300;y=300;width=100;height=100;/复位 this.repaint();/执行paint方法重绘public class Example6 new Frame6();/主类,谢谢!返回目录 结束放映,