《第20章动画——图形界面综合应用》由会员分享,可在线阅读,更多相关《第20章动画——图形界面综合应用(25页珍藏版)》请在金锄头文库上搜索。
1、第第第第2020章章章章 动画动画动画动画图形界面图形界面图形界面图形界面综合应用综合应用综合应用综合应用能力目标:能力目标:能力目标:能力目标:能编写能编写“ “气球飘飘气球飘飘” ”程序,定时播放若干个大小不等的彩程序,定时播放若干个大小不等的彩色椭圆。色椭圆。能编写图像幻灯片程序,并结合多线程,设定时间间隔自能编写图像幻灯片程序,并结合多线程,设定时间间隔自动放映。动放映。能编写能编写“ “空中飞翔空中飞翔” ”动画程序,并能设定间隔时间以控制动画程序,并能设定间隔时间以控制放映的速度,还能手工定格动画画面。放映的速度,还能手工定格动画画面。内容介绍20.1 任务预览20.2 气球飘飘2
2、0.3 图像幻灯片20.4 动画20.5 本章小结20.6 实训20:编写动画程序20.1 任务预览 本章实训程序运行结果: 20.2 气球飘飘 【例20-1】编写在窗框绘制椭圆的程序,要求在窗框上绘制10个彩色椭圆,各椭圆大小和位置不一,但最大不超过窗框尺寸的五分之一,并且各椭圆的色彩不尽相同。 分析:各椭圆位置和大小不一,色彩不一,涉及到随机数问题。 class Frame1 extends JFrame /窗框类Random rand = new Random(); /随机对象public Frame1() this.setTitle(随机绘制10个彩色椭圆); this.setBoun
3、ds(100, 100, 300, 250); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); public void paint(Graphics g) /绘制方法 int width, height; /窗框宽、高 width = this.getWidth(); height = this.getHeight(); g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); int x, y, w, h; Color color;
4、 /椭圆左、上、宽、高与颜色 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.nextInt(256); g.setColor(color); g.drawOval(x, y, w, h); 【例例20-2】编写编写“气球飘飘气球飘飘”程序:在窗框中每隔一定时间程序:
5、在窗框中每隔一定时间(如半秒)随机产生(如半秒)随机产生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, h; /椭圆左、上、宽、高 for (int i=1; i=10; i+) /
6、循环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.public void run() /线程
7、运行方法 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.start();
8、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(
9、) /初始化方法 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(I
10、nterruptedException e) 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 bu
11、ttonTime = new JButton(定时);JButton buttonUp = 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 (
12、int i=0; i6; i+)imgsi = Toolkit.getDefaultToolkit().createImage(images/child+i+.jpg); buttonPlay.addActionListener(new ActionHandler(); toolBar.add(buttonPlay); this.add(toolBar, BorderLayout.NORTH); this.add(canvas, BorderLayout.CENTER); buttonStop.setEnabled(false); /初始禁用“停止”按钮/按钮动作事件监听处理类(内部类):cl
13、ass ActionHandler implements ActionListener public void actionPerformed(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) /
14、若是“停止”按钮stopFlag = true; /设置停止标记thread = null;buttonPlay.setEnabled(true); /启用“放映”按钮buttonStop.setEnabled(false); /禁用“停止”按钮 else if(e.getSource()=buttonTime) /若是“定时”按钮String str = JOptionPane.showInputDialog( 请设定每幅图的放映时间(单位:毫秒), time);if (str = null) return; /若输入框按了“取消”按钮try int t = Integer.parseInt
15、(str); if (t0) throw new Exception(警告:请输入正整数!); time = t; catch(Exception ex) JOptionPane.showMessageDialog(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
16、= 0; /索引循环canvas.repaint(); /自定义画布类(内部类),该类与线程关联:class MyCanvas extends Canvas implements Runnable public void paint(Graphics g) /绘制方法 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
17、(stopFlag) break; /停止放映try Thread.sleep(time); catch(InterruptedException e) index +; if (index=6) index = 0; /索引循环this.repaint(); /执行paint方法重绘 20.4 动画 动画:活动的图画。在屏幕上显示第一帧图片,隔一小段时间如24分之一秒(约42毫秒)再显示下一帧图片,如此循环往复。定时刷新椭圆“气球”、自动放映图像,都可以说是动画,因为画面不断在“动”。程序可实现动画。最简单动画是图像沿着一条固定轨迹作直线运动。为了渲染气氛,可以使用一个背景图作衬托。 20.
18、4.1 窗框实现动画 【例20-5】编写“空中飞翔”动画程序:蓝天白云背景下,一个飞鸟从窗框右下角向左上角飞去,越飞越远,图像越来越小,消失后,下一飞鸟重复飞翔过程。 分析:只需使用两个图像文件,一作背景,二是飞鸟(前景)。两个文件可放在Eclipse项目根目录的images目录。飞鸟往左上角方向运动越来越小,只需不断减少图像的显示尺寸便可。为增强飞翔效果,飞鸟使用GIF图像文件。 class Frame5 extends JFrame /窗框类Image backImage, foreImage; /背景图、前景图int x=240, y=240, width=80, height=80;
19、/前景图位置、尺寸public Frame5() /构造方法this.setTitle(简单动画);this.setBounds(100, 100, 300, 300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);initialize(); /调用初始化方法this.setVisible(true);public void initialize() /初始化方法Toolkit toolkit = Toolkit.getDefaultToolkit(); backImage = toolkit.createImage(images/cl
20、oud.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, this);try Thread.sleep(42); /休眠42毫秒catch(InterruptedException e) x-=6; y-=6; width-=2; height-=2; /更改前景图位置和尺寸if(x0)
21、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的“空中飞翔”动画程序,添加工具栏和5个按钮:“放映”、“停止”、“定时”、“上飞”和“下飞”,控制图像放映状态。class Frame6 extends JFrameJToolBar toolBar =
22、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;MyPanel pan = new MyPanel(); /自定义面板Thread thread; /线程boolean stopFlag = true;Image b
23、ackImage, 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.createImage(images/flyer.gif);buttonPlay.addActionListener(new Actio
24、nHandler();buttonStop.addActionListener(new ActionHandler();buttonTime.addActionListener(new ActionHandler();buttonUp.addActionListener(new ActionHandler();buttonDwon.addActionListener(new ActionHandler();toolBar.add(buttonPlay); this.add(toolBar, BorderLayout.NORTH);this.add(pan, BorderLayout.CENTE
25、R);buttonStop.setEnabled(false); /初始禁用“停止”按钮/按钮动作事件监听处理类(内部类):class ActionHandler implements ActionListenerpublic void actionPerformed(ActionEvent e) if(e.getSource()=buttonPlay) /“放映”按钮 thread = new Thread(pan); stopFlag = false; buttonPlay.setEnabled(false); /禁用“放映”按钮 thread.start(); /启动线程 else if
26、(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 = Integer.parseInt(str); if (t0) th
27、row 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 JPanel implemen
28、ts 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(); /主类谢谢!返回目录返回目录 结束放映结束放映