導航:首頁 > 編程語言 > java動畫

java動畫

發布時間:2023-08-17 10:04:00

A. 怎麼用java做動畫

重寫paint方法,來實現將自己定義的圖片繪制到組件中,然後啟動一個線程來控制paint方法。 示例: ××××××××××××××××××××××××××× import javax.swing.*; import java.awt.*; class MyPanel extends JPanel implements Runnable { private Image img; private int i=0; private int j=0; public MyPanel() { img=new ImageIcon("1.png").getImage(); } public void paint(Graphics g) { g.drawImage(img,0,0,60,104,i*60,j*104,i*60+60,j*104+104,this); } public void run() { while(true) { while(j { while(i { try { Thread.sleep(300); } catch(Exception e) { } this.repaint(); i++; } j++; i=0; } i=0; j=0; } } } public class test extends JFrame { private MyPanel p; public test() { p=new MyPanel(); this.add(p,BorderLayout.CENTER); this.setBounds(300,200,300,300); this.setTitle("人物行走圖"); new Thread(p).start(); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String args[]) { new test(); } } ××××××××××××××××××××××× 將以上源碼保存為:test.java,編譯,然後下載下面的圖片 將下載的圖片改名為1.png" target="_blank" >



,然後將其和編譯後生成的class文件放在同一文件夾下,然後運行就可以了·~~

B. 如何優化java動畫編程中的顯示效果

Java動畫編程有多種實現方法,但它們實現的基本原理是一樣的,即在屏幕上畫出一系列的幀來造成運動的感覺。Java多線程技術是Java動畫編程中普遍運用的技術,它在控制動畫程序的流程和動畫的顯示效果方面起著重要的作用。Java動畫編程中的動畫閃爍和圖像殘缺不全等現象,是Java程序員經常遇到的問題。本文以作者應用實常式序為基礎,闡述如何運用多線程、重載Update、雙緩沖和圖像跟蹤等技巧來解決這類問題,以達到動畫顯示的最佳效果。
Java多線程技術
Java多線程技術簡介
目前,線程(Thread)已經為許多操作系統和應用開發系統所採用。線程是程序的單個控制流,具有順序程序的特點。但是,線程不是一個程序,它僅僅是程序的一個執行序列。線程具有很強的並發功能,在同一時刻可以有多個線程同時處於執行狀態。線程是動態的,具有一定的生命周期,分別經歷從創建、執行、阻塞、直到消亡的過程。Java語言對多線程編程的支持有兩種實現方法:一種是直接繼承Thread類,另一種是實現Runnable介面。Thread類提供了對線程的控制方法,如start(),stop(),run()、suspend()、resume()和sleep()等方法,它們可以對線程的狀態進行控制。
動畫線程的設計與實現
為了每秒中多次更新屏幕,必須創建一個線程來實現動畫的循環,這個循環要跟蹤當前幀並響應周期性的屏幕更新要求。許多Java初學者容易犯的一個錯誤是將動畫循環放在paint()中,這樣占據了主AWT線程,而主線程將負責所有的繪圖和事件處理。因此,應該生成一個獨立的動畫線程來完成圖像的顯示和更新。例如,在一個Applet框架下,當Applet啟動(Start)時,生成一個動畫線程;在Applet停止(stop)時,終止該動畫線程以釋放它所佔用的CPU資源。下列程序代碼(簡稱「C1」代碼)是該動畫線程的具體實現:
public void start() {
if(animatorThread==null) {
animatorThread=new Thread(this);
//開始動畫線程
animatorThread.start();
}
}
public void stop(){
//停止動畫線程
animatorThread=null;
}
上面終止動畫線程的時候,並不是調用該動畫線程的stop()方法,而是設置該動畫線程為null。因為如果直接調用線程的stop()方法會強制線程終止所有的執行工作,有時會帶來不好的結果。設置該動畫線程為null,則在run()方法中,由於不滿足循環條件,線程會自然退出。這樣,也進一步優化了該動畫程序。
重載update()和雙緩沖技術消除閃爍
在Java中,動畫發生閃爍有兩個原因:一個是由於在顯示下一幀畫面的時候,調用了repaint()方法;而repaint()方法被調用時,要清除整個背景,然後才調用paint()方法顯示畫面。這樣,在清除背景和繪制圖像的短暫時間間隔內被用戶看見的就是閃爍。另一個是由於paint()方法要進行復雜的計算,繪制每一幀花費的時間太長,圖像中的各個像素值不能同時得到,使得動畫的生成頻率低於顯示器的刷新頻率,從而造成閃爍。
下面兩種方法可以明顯地消除或減弱閃爍。
重載update()方法
當AWT接收到一個Applet的重繪請求時,它就調用Applet的update()方法。預設情況下,update()方法清除Applet的背景,然後調用paint()方法。重載update()方法就可以將以前在paint()方法中的繪圖代碼包含在update()方法中,從而避免每次重繪時將整個區域清除。既然背景不再自動清除,Java程序員需要自己在update()中完成。
雙緩沖技術
另一種消除幀之間閃爍的方法是使用雙緩沖技術,它在許多動畫Applet中被使用。主要原理是創建一幅後台圖像,將每一幀畫入圖像,然後調用drawImage()方法將整個後台圖像一次畫到屏幕上去。這種方法的優點在於大部分繪制是離屏的。將離屏圖像一次繪至屏幕上,比直接在屏幕上繪制要有效得多。在創建後台圖像前,首先要通過調用createImage()方法生成合適的後台緩沖區,然後獲得在緩沖區做圖的環境(即Graphics類對象)。
下列實常式序代碼(簡稱「C2」代碼)就是這兩種方法的結合使用,雙緩沖技術在重載update()方法中實現。其中,offImage是Image類的對象,offGraphics是Graphics類的對象,這兩個類對象是實現雙緩沖技術的關鍵。相關代碼如下:
public void paint(Graphics g){
update(g);
}
public void update(Graphics g){
Dimension d=getSize();
//如果後台圖像不存在,就創建一個後台圖像
if((offGraphics==null)||(d.width!=offDimension.width)
||(d.height!=offDimension.height)) {
offDimension=d;
offImage=createImage(d.width,d.height);
offGraphics=offImage.getGraphics();
}
//擦除上一幀
offGraphics.setColor(getBackground());
offGraphics.fillRect(0,0,d.width,d.height);
offGraphics.setColor(Color.black);
//將當前的幀輸出到指定的image中
for(int i=0 ; i<10 ; 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);
}
雙緩沖技術可以使動畫平滑,但有一個缺點,要分配一個後台圖像的緩沖,如果圖像相當大,這將佔用很大一塊內存。
圖像跟蹤與程序的逐步完善
圖像跟蹤
當動畫線程剛剛啟動的時候,由於沒有全部載入圖像,屏幕上顯示的畫面經常是殘缺不全的。這時可以使用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()方法休眠一個固定的

C. 如何消除Java動畫中的閃爍現象

如果感覺VRAY渲動畫閃爍,換個版本就好了。 現在1.093 n、 m、 r 等版本都不會閃爍vray的閃爍問版題有很多種,權max才出來的時候有個formax6覆蓋版(裝出來1.09n)的閃爍嚴重(正常設置多偵渲染每偵背景色都會不同,這個應該是破解缺陷),後來正式n版出來就沒有這個問題了,目前我用一個解壓安裝r版,和那個for6的一樣的問題,需要預裝正式安裝的n版升級後使用也去掉背景問題。另一種閃爍是反鋸齒沒開或者使用了過於銳化的filter導致細節閃爍,這個是正常的。最後我說為什麼認為全局光無法動畫,動畫有2種類型,動態相機和動態場景,我試了不少參數(可恨vray出了這么久卻只提供1.00的使用說明)結果是vray不能正確計算移動物體間的全局光陰影(這個讓我明白當初stage-1出來為什麼囂張的說第一個解決了全局光動畫問題),vray的多偵渲染中2個交錯物體間互相的天光陰影不能動態更新(或者說更新的太糟),所以我說不能動畫全局光。

D. 求java做動畫代碼

importjava.awt.Canvas;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.EventQueue;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
importjava.awt.Image;
importjava.awt.RenderingHints;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.IOException;
importjavax.imageio.ImageIO;


{
=1L;
privatestaticbooleanPRESSED=false;
privatestaticintpointX=0;
privatestaticintpointy=200;
privatestaticintRIGHT_GO=0;
privatestaticintLEFT_GO=0;
privatestaticintDIR=0;
privatestaticintANGLE=0;
privatestaticintW=50;
privatestaticintH=60;
private_Canvascanvas=null;

publicTestImage()
{
(canvas=new_Canvas());
setIgnoreRepaint(true);
requestFocus();
}

publicclass_
{
=1L;
privateBufferedImagebi=null;
privateImagebufferedImage=null;
privateThreadthread=null;
privatelongsleepTime=10;

public_Canvas()
{
try
{
bi=ImageIO.read(newFile("go.png"));
}
catch(IOExceptione)
{}
setBackground(Color.BLACK);
requestFocus();
addKeyListener(newKeyListener()
{
@Override
publicvoidkeyTyped(KeyEvente)
{}

@Override
publicvoidkeyReleased(KeyEvente)
{
RIGHT_GO=0;
PRESSED=false;
}

@Override
publicvoidkeyPressed(KeyEvente)
{
//38403739上下左右
DIR=e.getKeyCode();
PRESSED=true;
}
});
}

@Override
publicvoidpaint(Graphicsg)
{
Graphics2Dg2d=(Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.drawImage(rotateImage(bi.getSubimage(RIGHT_GO,LEFT_GO,W,H),ANGLE,true),pointX,pointy,W,H,
this);
g2d.dispose();
}

@Override
publicvoipdate(Graphicsg)
{
if(null==bufferedImage)
{
bufferedImage=createImage(getWidth(),getHeight());
}
GraphicsbufferedG=bufferedImage.getGraphics();
bufferedG.clearRect(0,0,getWidth(),getHeight());
paint(bufferedG);
bufferedG.dispose();
g.drawImage(bufferedImage,0,0,this);
g.dispose();
}

publicvoidstart()
{
thread=newThread(this);
thread.setName("TestImage");
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}

publicsynchronizedvoidstop()
{
thread=null;
notify();
}

@Override
publicvoidrun()
{
Threadme=Thread.currentThread();
while(thread==me&&!isShowing()||getSize().width==0)
{
try
{
Thread.sleep(555);
}
catch(InterruptedExceptione)
{
return;
}
}
while(thread==me&&isShowing())
{
if(PRESSED)
{
try
{
if(DIR==39)
{
RIGHT_GO=RIGHT_GO+50;
LEFT_GO=0;
pointX=pointX+1;
if(pointX>420)
{
ANGLE=90;
pointX--;
pointy--;
W=60;
H=50;
}
if(RIGHT_GO>50)
{
RIGHT_GO=0;
}
}
elseif(DIR==37)
{
pointX=pointX-1;
RIGHT_GO=RIGHT_GO+50;
LEFT_GO=60;
if(pointX<0)
{
ANGLE=-90;
pointX++;
pointy--;
W=60;
H=50;
}
if(RIGHT_GO>50)
{
RIGHT_GO=0;
}
}
elseif(DIR==38)
{
W=50;
H=60;
pointy=150;
ANGLE=0;
RIGHT_GO=100;
}
elseif(DIR==40)
{
W=50;
H=60;
ANGLE=0;
pointy=200;
RIGHT_GO=0;
}
Thread.sleep(sleepTime);
repaint();
}
catch(InterruptedExceptione)
{
break;
}
}
else
{
RIGHT_GO=RIGHT_GO+50;
LEFT_GO=0;
pointX=pointX+1;
if(RIGHT_GO>50)
{
RIGHT_GO=0;
}
if(pointX>500)
{
pointX=0;
}
try
{
Thread.sleep(sleepTime);
repaint();
}
catch(InterruptedExceptione)
{
break;
}
}
}
thread=null;
}
}

/**
*旋轉圖像為指定角度
*
*@paramdegree
*@return
*/
(finalBufferedImageimage,finalintangdeg,finalbooleand)
{
intw=image.getWidth();
inth=image.getHeight();
inttype=image.getColorModel().getTransparency();
BufferedImageimg;
Graphics2Dgraphics2d;
(graphics2d=(img=newBufferedImage(w,h,type)).createGraphics()).setRenderingHint(
RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.rotate(d?-Math.toRadians(angdeg):Math.toRadians(angdeg),w/2,h/2);
graphics2d.drawImage(image,0,0,null);
graphics2d.dispose();
returnimg;
}

publicstaticvoidmain(String[]args)
{
EventQueue.invokeLater(newRunnable()
{
@Override
publicvoidrun()
{
finalTestImageti=newTestImage();
ti.setSize(newDimension(500,300));
ti.setLocationRelativeTo(null);
ti.addWindowListener(newWindowAdapter()
{
@Override
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}

@Override
publicvoidwindowDeiconified(WindowEvente)
{
ti.canvas.start();
}

@Override
publicvoidwindowIconified(WindowEvente)
{
ti.canvas.stop();
}
});
ti.setResizable(false);
ti.canvas.start();
ti.setVisible(true);
}
});
}
}

E. 2.Java有哪幾種常見的實現動畫的方法

一: 用多線程播放一組圖片, 實現動畫片的效果; 類似於逐幀動畫,每個圖片是動畫的一幀

二: 在awt/swing界面里, 可以使用paint方法,去繪制圖形,然後用swing提供的Timer或者多線程技術,去刷新繪制的圖形

三:在JavaFX里, 本身就支持動畫,並且封裝了很多動畫效果可以直接使用,比如逐幀動畫.縮放動畫,漸變動畫,旋轉動畫,位置動畫等.

強烈推薦使用javaFX來實現動畫, 因為javaFX是現代化的圖形界面工具,具有簡單,強大,組件豐富,跨平台,支持Html5, 支持表格, 支持動畫等多種優勢

下面是一個javaFX繪制的動態表格

javaFX動態表格

F. 如何使用JAVA語言進行動畫設計

為創造一個動畫,首先必須做出一系列畫片,可以循環顯示的形式,以保證用較少的圖片顯示較長的時間,最後一般做法是創建一個線程,把圖片演示放入線程中,這樣就可以充分利用計算機資源

更加詳細的你也可以去華信參考一下,應該對你有幫助

閱讀全文

與java動畫相關的資料

熱點內容
javadbfreader 瀏覽:307
蘋果手機數字代碼是什麼 瀏覽:66
驅動程序順序安裝腳本 瀏覽:665
word文件里怎樣查重 瀏覽:219
mx5系統基帶版本 瀏覽:184
ntlea全域通win10 瀏覽:171
qq怎麼查看別人的收藏 瀏覽:135
地震三參數matlab程序 瀏覽:57
怎樣給優盤文件加密軟體 瀏覽:7
收拾文件有哪些小妙招 瀏覽:431
pdf文件去底網 瀏覽:253
win10重裝系統需要格式化c盤嗎 瀏覽:424
路由器trx文件 瀏覽:655
淘寶店鋪數據包怎麼做 瀏覽:195
win10鍵盤黏連 瀏覽:332
json如何生成表格 瀏覽:323
怎麼修復sql資料庫表 瀏覽:40
微信微博差別 瀏覽:163
簽到積分換禮品app 瀏覽:812
mfc最近打開文件 瀏覽:672

友情鏈接