华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> javaWeb >> 文章內(nèi)容

JavaApplet實(shí)現(xiàn)動(dòng)畫特技

來源:中華考試網(wǎng)  [2020年11月28日]  【

  Java 不僅提供了對(duì)圖形、圖像的支持,還允許用戶實(shí)現(xiàn)連續(xù)的圖像播放,即動(dòng)畫技術(shù)。Java 動(dòng)畫的實(shí)現(xiàn),首先用Java.awt 包中的 Graphics 類的drawImage()方法在屏幕上畫出圖像,然后通過定義一個(gè)線程,讓該線程睡眠一段時(shí)間,然后再切換成另外一幅圖像;如此循環(huán),在屏幕上畫出一系 列的幀來造成運(yùn)動(dòng)的感覺,從而達(dá)到顯示動(dòng)畫的目的。

  為了每秒鐘多次更新屏幕,必須創(chuàng)建一個(gè)線程來實(shí)現(xiàn)動(dòng)畫的循環(huán),這個(gè)循環(huán)要跟蹤當(dāng)前幀并響應(yīng)周期性的屏幕更新要求;實(shí)現(xiàn)線程的方法有兩種,可以創(chuàng)建一個(gè)類Thread 的派生類,或附和在一個(gè)Runnable 的界面上。

  * 動(dòng)畫技巧

  在編寫動(dòng)畫過程時(shí),遇到最常見的問題是屏幕會(huì)出現(xiàn)閃爍現(xiàn)象。閃爍有兩個(gè)原因:一是繪制每一幀花費(fèi)的時(shí)間太長(因?yàn)橹乩L時(shí)要求的計(jì)算量大);二是在每次調(diào)用Pain()前,Java 會(huì)用背景顏色重畫整個(gè)畫面,當(dāng)在進(jìn)行下一幀的計(jì)算時(shí),用戶看到的是背景。

  有兩種方法可以明顯地減弱閃爍:重載 update()或使用雙緩沖。

  (1) 重載 update()

  當(dāng)AWT接收到一個(gè)applet的重繪請(qǐng)求時(shí),它就調(diào)用applet的 update(),默認(rèn)地,update() 清除applet的背景,然后調(diào)用 paint()。重載 update(),將以前在paint()中的繪圖代碼包含在update()中,從而避免每次重繪時(shí)將整個(gè)區(qū)域清除。下面是 update()方法的原始程序代碼:

  public void update(Graphics g)

  {

  //首先用背景色來繪制整個(gè)畫面

  g.setColor(getBackGround());

  g.fillRect(0,0,width,height);

  //接著設(shè)置前景色為繪制圖像的顏色,然后調(diào)用paint()方法

  g.setColor(getForeGround());

  paint(g);

  }

  所以要消除畫面閃爍就一定要改寫 update() 方法,使該方法不會(huì)清除整個(gè)畫面,只是消除必要的部分。

  (2) 使用雙緩沖技術(shù)

  另一種減小幀之間閃爍的方法是使用雙緩沖,它在許多動(dòng)畫 Applet中被使用。其主要原理是創(chuàng)建一個(gè)后臺(tái)圖像,將需要繪制的一幀畫入圖像,然后調(diào)用DrawImage()將整個(gè)圖像一次畫到屏幕上去;好處是大 部分繪制是離屏的,將離屏圖像一次繪至屏幕上比直接在屏幕上繪制要有效得多,大大提高做圖的性能。

  雙緩沖可以使動(dòng)畫平滑,但有一個(gè)缺點(diǎn),要分配一張后臺(tái)圖像,如果圖像相當(dāng)大,這將需要很大一塊內(nèi)存;當(dāng)你使用雙緩沖技術(shù)時(shí),應(yīng)重載 update()。

  下面舉一個(gè)時(shí)鐘的例子來說明如何處理動(dòng)畫

  //AnimatorDemo.java

  import java.util.*;

  import java.awt.*;

  import java.applet.*;

  import java.text.*;

  public class AnimatorDemo extends Applet implements Runnable

  填寫下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽java課程!害怕學(xué)不會(huì)?助教陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!

預(yù)約申請(qǐng)免費(fèi)聽java課程

  • 地區(qū):
  • 姓名:
  • 手機(jī):

  {

  Thread timer; // 用于顯示時(shí)鐘的線程

  int lastxs, lastys, lastxm,

  lastym, lastxh, lastyh;

  SimpleDateFormat formatter; //格式化時(shí)間顯示

  String lastdate; // 保存當(dāng)前時(shí)間的字符串

  Font clockFaceFont; //設(shè)置顯示時(shí)鐘里面的數(shù)字的字體

  Date currentDate; // 顯示當(dāng)前時(shí)間

  Color handColor; // 用于顯示時(shí)針、分針和表盤的顏色

  Color numberColor; // 用于顯示秒針和數(shù)字的顏色

  public void init()

  {

  int x,y;

  lastxs = lastys = lastxm = lastym = lastxh = lasty

責(zé)編:fushihao
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學(xué)歷考試
六安市| 孟津县| 张家港市| 三台县| 郯城县| 阿鲁科尔沁旗| 洪洞县| 亚东县| 夏邑县| 襄城县| 盐池县| 中江县| 乐都县| 炎陵县| 乌拉特前旗| 思茅市| 辽阳市| 临武县| 剑河县| 沙田区| 合作市| 衡水市| 沭阳县| 孝义市| 曲阳县| 亚东县| 德兴市| 阳城县| 大同市| 碌曲县| 西华县| 江山市| 巧家县| 浠水县| 五家渠市| 遂溪县| 固安县| 县级市| 黑水县| 安西县| 麟游县|