微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 如何制作动画程序

如何制作动画程序

时间:05-07 来源:互联网 点击:

定时间或定时执行。

■4-1-2-1时间的使用

Timer类和TimerTask类能够实现计时器的功能。

实例化一个TIMER的类,再调用一个继承了TIMERTASK的类做SCHEDULE。这样,TimerTask子类的run()就会在指定时间或周期被Timer实例呼叫。(表1)

Table1

Timer

在Timer类中主要使用下面的方法。

•voidschedule(TimerTasktask,Datedate)

•voidschedule(TimerTasktask,Datedate,longperiod)

•voidschedule(TimerTasktask,longdelay)

•voidschedule(TimerTasktask,longdelay,longperiod)

•voidcancel()

这些schedule方法用于设定任务及何时执行。若不设定第三个自变量period,在第二个自变量所指定的时间任务只执行一次。否则第二个自变量所指定的时间之后,任务会反复执行,自变量period是反复执行时的延时。另外,呼叫出cancel方法,则会结束计时器程序。

TimerTask

TimerTask是抽象类。需要定义其子类。在所继承的类中必须重载抽象方法run(),必须根据计时器的schedule定义具体的操作。

在TimerTask类中主要使用如下的方法。

•abstractvoidrun()

•voidcancel()

按照Timer类中所设定的schedule执行run()方法。用cancel()方法能够结束任务。

现在来看看用线程实现的圆球运动的动画--在这里我们也可以使用计时器来实现。如下所示:(ex.5)

importjavax.microedition.lcdui.Display;

importjavax.microedition.midlet.*;

/**

*球飞出去的动画实例计时器版

*/

publicclassTimerMovingBallextendsMIDlet{

privateDisplaydisplay;

privateTimerMovingBallCanvascanvas;

/**

*构造函数

*/

publicTimerMovingBall(){

display=Display.getDisplay(this);

canvas=newTimerMovingBallCanvas();

}

/**

*运行时的处理

*/

protectedvoidstartApp()throwsMIDletStateChangeException{

display.setCurrent(canvas);

}

protectedvoidpauseApp(){}

protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}

}

importjava.util.*;

importjavax.microedition.lcdui.*;

/**

*球飞出去的实例动画的canvas。

*/

publicclassTimerMovingBallCanvasextendsCanvas{

privateintx;//球的x坐标

privateImageimg;

privateTimertimer;

privateTimerTasktask;

/**

*构造函数

*/

publicTimerMovingBallCanvas(){

//读取画像

try{

img=Image.createImage(/back.PNG);

}catch(Exceptione){

e.printStackTrace();

}

//Timer,TimerTask的设定

timer=newTimer();

task=newTimerMovingBallTask(this);

timer.schedule(task,100,100);

//从第101毫秒开始在每100毫秒运行任务

}

/**

*描绘方法

*/

protectedvoidpaint(Graphicsg){

g.drawImage(img,0,0,Graphics.LEFT|Graphics.TOP);

//表示球

g.setColor(255,0,0);

g.drawString(“withTimer”,0,0,Graphics.TOP|Graphics.LEFT);

g.fillArc(x,50,40,40,0,360);

}

/**

*能够变化球的X坐标

*/

publicvoidincrement(){

x+=3;

}

}

/**

*计时器任务根据计时器所设定的时间表,运行run()方法。

*/

classTimerMovingBallTaskextendsTimerTask{

privateTimerMovingBallCanvascanvas;

/**

*构造函数

*/

publicTimerMovingBallTask(TimerMovingBallCanvascanvas){

this.canvas=canvas;

}

/**

*呼叫计时器时所进行的处理

*/

publicvoidrun(){

canvas.increment();

canvas.repaint();

}

}

ex.5

TimerMovingCanvas类的构造函数中进行下面的计时器设定。

//Timer,TimerTask的设定

timer=newTimer();

task=newTimerMovingBallTask(this);

timer.schedule(task,100,100);//从第101毫秒开始在每100毫秒运行任务

在TimerMovingBallTask中,从TimerTask继承的run()被调用,X坐标的递增使得球运动起来。这样有规律地使X坐标递增,就使得圆球在画面上从左到右移动。(图2)。

publicvoidrun(){

canvas.increment();

canvas.repaint();

}

2

■双缓冲

一旦进行动画就要频繁地反复操作描绘处理,画面处理中可能会突然发生屏幕闪烁。为了能够控制屏幕的闪烁,一般会使用双缓冲的手法。用双缓冲存储器并不是直接在画面上进行描绘,而是在被称为屏幕外画像的虚拟画像上描绘全部之后,由于是表示画面,所以能控制屏幕的闪烁。(图3)

Figure3

根据手机机种的不同,事先将Canvas类与双缓冲存储器相对应的情况也是有的。换言之,即使实现方没有明确地定义双缓冲存储器,则在用双缓冲存储器的机制进行描绘的情况下,没必要特别关心闪烁的解决方案,但是要在不同的机型上运行。N800的机型已经能适应此双缓冲存储器。为此,开发N800应用程序的时候,有时会有必要在这阐述双缓冲存储器

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top