Java动画及自动浏览图片程序的开发
2008-01-05 09:20:27 来源:WEB开发网核心提示:郭圣文摘要 本文介绍了java文字及图象动画的实现方法,并讨论了如何采用双缓冲技术来消除画面的闪烁现象,Java动画及自动浏览图片程序的开发,在此基础之上,开发了一个自动浏览图片程序,同时,后台图形缓冲区进入下一帧图象的预备,要害词 Java动画 双缓冲技术 自动浏览图片电影和电视的画面可以理解为一种动画显示,它们一般
郭圣文
摘要 本文介绍了java文字及图象动画的实现方法,并讨论了如何采用双缓冲技术来消除画面的闪烁现象,在此基础之上,开发了一个自动浏览图片程序。
要害词 Java动画 双缓冲技术 自动浏览图片
电影和电视的画面可以理解为一种动画显示,它们一般以每秒24帧的速度显示图象,利用人眼的暂停效应,产生一个连续的动作显示过程。因此,动画的本质是运动的图形,只要动画的速度(帧速度)足够快,则分散的的静态图形就会合并为一个连续运动的流程。
Java动画的实现,首先用Java.awt包中Graphics类的drawImage()方法在屏幕画出图象,然后通过定义一个线程,让该线程睡眠一段时间,到时后再切换成另外一幅图象,如此循环,从而达到显示动画的目的。
1 有关概念、类及方法
1.1 线程
Java的重要特性之一是其支持多线程的程序设计。在传统的程序设计中,要执行多任务是通过定时器中断等方法,定时监控多个任务的执行情况,采用任务中断切换的方式来轮换执行各个任务,从而达到多任务并发目的。这种方法一方面消耗了大量的内存空间和cpu资源,另一方面会带来系统安全性的问题。而线程作为程序的一个执行流,在某一瞬间可被看成计算过程的一种状态,它比进程更小,并发程度更高,因此也称为轻进程。线程是cpu调度的基本单元,而进程是资源分配的基本单元,线程的引入可以提高系统的吞吐量、提高任务之间的通讯效率、有效利用系统资源。
?线程的创建
线程创建有两种方法,一种是用new产生一个Thread类对象,另外一种方法是实现Runnable接口。在需要实现多继续,并且又要建立多线程时,只能采用Runnable接口方法。我们这里采用第一种方法:
ThreadName=new Thread
?sleep(long)
让线程睡眠一定时间不动作,参数单位为千分之一秒。
?suspend()
挂起线程,暂停其执行。
?resume()
唤醒挂起的线程。
1.2 ToolKit类
它提供了AWT与平台相关类和无关类之间的链接,提供了几种方法来访问与设备相关的一些特征。如从URL或本地系统中检索图象、获取屏幕的显示特征等。在程序中定义一个ToolKit类:ToolKit=getToolKit();
1.3 MediaTracker类
提供了治理图象文件加载的能力。方法StatusID(int id,boolean load)的作用是检测加载图象文件的状态(ABORTED,COMPLETE,ERRORED,LOADING),当检测到状态为COMPLETE时,说明图象加载完成。
2 文字动画
文字动画的实现程序比较简单,首先,用new方法创建一个新进程,用drawString()方法在屏幕显示相应文字,然后让进程睡眠一定时间,时间到后,改变文字显示位置,再重显文字。其中包含一个边界判定,重设坐标的过程,如此往复实现文字动画。程序运行后,在屏幕中心显示"欢迎进入动画世界!",每隔0.15秒向左移动一次,直到屏幕最左端又重新开始显示。具体程序见程序1(Applet小程序)。
3 图象动画
图象动画的实现方法与文字相似,只不过定义了一个Image数组,运用getImage()方法装载相应图象文件到该数组中。程序运行后,可见到一个可爱的小精灵在作抛球动作。另外,基于程序交互性的考虑,增加了两个事件的响应动作,一个是WINDOW_DESTROY,即关闭运行窗口,正常返回。另外一个是MOUSE_DOWN,当鼠标左按钮按下时,暂停线程以便让画面静止,再按一次左按钮,恢复暂停线程,继续显示下一幅画面。
假如将程序中的小精灵图象文件换成图片,并增加延迟时间,则可以实现图片的自动切换,变为自动浏览图片程序,源程序见程序2,
4 动画质量的改善
上一程序的运行后,我们发现了两个问题。第一是程序在图象完全加载之前就开始显示,出现切换过快现象。第二是画面闪烁。
对于前一个问题,可以用Java.awt包中的MediaTracker类来解决,当StatusID()方法返回值为COMPLETE时,说明所有的图象文件加载完毕,此时才开始显示画面。
第二个问题,解决起来要复杂一些。闪烁产生的原因是,在paint()方法中假如计算较为复杂,计算和绘制画面的时间超过了屏幕的刷新周期,则帧的第一部分在一个刷新周期中绘制,其余部分在下一个、甚至更后的周期绘制,这样,在帧的不同部分之间产生时间间隔,由此造成闪烁。解决途径之一是重载update()方法,update()的缺省实现是清除原来背景,然后调用paint()方法。因此通过重载update(),只有在必要时才清除整个背景。
解决途径之二是采用双缓冲技术,双缓冲技术是在后台图形区内创建一个图形对象,将需要绘制的图象绘于其上,然后传给paint()方法,由paint()方法绘于前台,同时,后台图形缓冲区进入下一帧图象的预备。图1为双缓冲技术示意图。
更多精彩
赞助商链接