Java動畫編程有多種實現方法
Java多線程技術
Java多線程技術簡介
目前
動畫線程的設計與實現
為了每秒中多次更新屏幕
public void start() {
if(animatorThread==null) {
animatorThread=new Thread(this);
//開始動畫線程
animatorThread
}
}
public void stop(){
//停止動畫線程
animatorThread=null;
}
上面終止動畫線程的時候
重載update()和雙緩沖技術消除閃爍
在Java中
下面兩種方法可以明顯地消除或減弱閃爍
重載update()方法
當AWT接收到一個Applet的重繪請求時
雙緩沖技術
另一種消除幀之間閃爍的方法是使用雙緩沖技術
下列實例程序代碼(簡稱
public void paint(Graphics g){
update(g);
}
public void update(Graphics g){
Dimension d=getSize();
//如果後台圖像不存在
if((offGraphics==null)||(d
||(d
offDimension=d;
offImage=createImage(d
offGraphics=offImage
}
//擦除上一幀
offGraphics
offGraphics
offGraphics
//將當前的幀輸出到指定的image中
for(int i=
offGraphics.drawImage(images[i],frameNumber*5%(d.width/2)
,i*d.height/10,this);
}
//輸出指定的後台圖像
g.drawImage(offImage,frameNumber*5%(d.width/2),0,this);
}
雙緩沖技術可以使動畫平滑,但有一個缺點,要分配一個後台圖像的緩沖,如果圖像相當大,這將占用很大一塊內存。tW.wINgWIt.cOM
圖像跟蹤與程序的逐步完善
圖像跟蹤
當動畫線程剛剛啟動的時候,由於沒有全部載入圖像,屏幕上顯示的畫面經常是殘缺不全的。這時可以使用MediaTracker或ImageOberver類對象進行圖像跟蹤,待圖像全部載入後,再調用drawImage()方法將圖像輸出到屏幕上去。DrawImage()方法的第四個參數正是ImageObserver類對象,所以可以用ImageObserver類對象進行圖像跟蹤。在實際應用Applet程序的init()方法中實現圖像跟蹤,相當於在動畫線程的DrawImage()方法調用以前就畫了一次圖像,因為動畫線程的初始化過程,即init()方法是先被調用的。下列代碼(簡稱“C3”代碼)展示了init()方法使用MediaTracker類對象來實現跟蹤圖像的載入,代碼如下:
public void init(){
tracker=new MidiaTracker(this);
for(int i=1;i<=10;i++){
image[i-1]=getImage(getCodeBase(),"image"+i+" .gif");
//用MediaTracker類對象的addImage()方法跟蹤圖像的載入
tracker.addImage(images[i-1],0);
}
......
}
程序的進一步完善
在“C2”代碼的重載update()方法中加入下列if語句,從而對MediaTracker類對象的圖像跟蹤方法做出判斷,if語句如下:
if(!tracker.checkAll()){
//如果圖像還沒有裝載完畢,則僅清除背景,同時輸出一個狀態
g.clearRect(0,0,d.width,d.height);
g.drawString("Please wait...",0,d.height/2);
return;
}
在“C1”代碼的stop()方法中加入兩行代碼,用以釋放由雙緩沖技術所占用的內存資源,這時stop()方法改為:
public void stop(){
//停止動畫線程
animatorThread=null;
//釋放用於雙緩沖的內存資源
offGraphics=null;
offImage=null;
}
程序修改到此,還有一個小問題,就是動畫線程啟動後,第一幅圖像有時仍有殘留痕跡,而不是隨著圖像的更新而完全擦除掉。如果想解決此問題,只要將“C2”代碼中最後的for()循環和g.drawImage()方法改為如下代碼就可以了。
for(int i=0;i<10;i++){
offGraphics.drawImage(images[frameNumber%10],
,frameNumber*5%(d.width),i*d.height/10,this);
}
g.drawImage(offImage,0,0,this);
保持恆定的幀速度
為了使用戶觀看動畫時沒有閃爍感,至少需要達到每秒12幀的速度。更高的幀速度會產生更平滑的動畫。通常,在動畫顯示的每兩幀之間,調用線程的sleep()方法休眠一個固定的時間。這樣做的缺點是使用絕對的延遲時間會使延遲過長,即造成等待時間過長。為了每秒顯示10~20幀圖像,並保持恆定的幀速度(也就是恆定的顯示頻率),在動畫線程的run()方法中可加入如下代碼:
try{
startTime+=delay;
Thread.sleep(Math.max(0,startTime-System.currentTimeMillis()));
}catch(InterruptedException e){
break;
}
本文著重闡述了優化Java動畫編程的顯示效果的幾種方法。當然,隨著Java技術以及其它計算機技術的發展,還將會有多種優化動畫顯示效果的方法,例如,在提高動畫的幀速度方面,可在Java中調用微軟公司的DirectDraw工具。但是本文所介紹的方法更具有通用性。
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19234.html