[JavaME]利用java.util.TimerTask来做Splash Screen的N种方法

请参考java.util.TimerTask.

TimerTask is something like Timer in VisualBasic. You can sepcify a time period in milliseconds

for your requirement"一幅LOGO显示完以后,几秒种自动显示下一幅LOGO". 
Here is an sample code.

public void testTimer() {
MyTimerTask myTimerTask = new MyTimerTask();
Timer timer = new Timer();
timer.schedule(myTimerTask, 5000, 10000); //wait for 5 seconds and then call the function every 

10 seconds
}

class MyTimerTask extends TimerTask {
public void run() {
//This method will be called every 10 Seconds

Image im = Image.createImage(imageData, 0, imageData.length);
if(im == null)
System.out.println("NULL IMAGE");
System.out.println("The Size of the Byte Array is:" +imageData);
if(frm.size() > 0)
for(int i = 0; i < frm.size(); i++)
frm.delete(i);
frm.append(im);
disp.setCurrent(frm);

}
}

 

 

另外,对于你所说的是不是应该叫做SplashScreen,那么国外曾经有人给出这么一个例子,虽然不是周期性地显示一张又一张的图片,而是利用TimerTask周期性地repaint画布,画出一种Splash Screen的感觉,你可以参考:

import java.util.*;

import javax.microedition.lcdui.*;

public class WaitCanvas
extends Canvas {
private int mCount, mMaximum;
private int mInterval;

private int mWidth, mHeight, mX, mY, mRadius;
private String mMessage;

public WaitCanvas() {
mCount = 0;
mMaximum = 36;
mInterval = 100;

mWidth = getWidth();
mHeight = getHeight();

// Calculate the radius.
int halfWidth = (mWidth - mRadius) / 2;
int halfHeight = (mHeight - mRadius) / 2;
mRadius = Math.min(halfWidth, halfHeight);

// Calculate the location.
mX = halfWidth - mRadius / 2;
mY = halfHeight - mRadius / 2;

// Create a Timer to update the display.
TimerTask task = new TimerTask() {
public void run() {
mCount = (mCount + 1) % mMaximum;
repaint();
}
};
Timer timer = new Timer();
timer.schedule(task, 0, mInterval);
}

public void setMessage(String s) {
mMessage = s;
repaint();
}

public void paint(Graphics g) {
int theta = -(mCount * 180 / mMaximum);


// Clear the whole screen.
g.setColor(255, 255, 255);
g.fillRect(0, 0, mWidth, mHeight);

// Now draw the pinwheel.
g.setColor(0, 0, 0);

g.drawArc(mX, mY, mRadius, mRadius, 0, 360);

g.fillArc(mX, mY, mRadius, mRadius, theta + 20, 20);
//g.fillArc(mX, mY, mRadius, mRadius, theta + 60, 60);
//g.fillArc(mX, mY, mRadius, mRadius, theta + 90, 90);
//g.fillArc(mX, mY, mRadius, mRadius, theta + 120, 120);

// Draw the message, if there is a message.
if (mMessage != null)
g.drawString(mMessage, mWidth / 2, mHeight,
Graphics.BOTTOM | Graphics.HCENTER);
}
}

上面那个是利用TimerTask自动定时填充图形来展示Splash Screen的,那么下面这个就是显示图片来Splash Screen了:

 

import java.util.*;
import javax.microedition.lcdui.*;

public class Splash extends Canvas {

private Display display;
private Displayable next;
private Timer timer=new Timer();

public Splash (Display display,Displayable next) {
this.display=display;
this.next=next;
display.setCurrent(this);
}

protected void showNotify () {
timer.schedule( new TimerTask () { public void run() {
displayNext(); }},8000);
}

protected void hideNotify() {
timer.cancel();
}

protected void keyPressed (int keycode) {
displayNext();
}

protected void pointerPressed (int x, int y) {
displayNext();
}

private void displayNext() {
display.setCurrent(next);


protected void paint (Graphics g) {
int height=this.getHeight();
int width=this.getWidth();

// fill background as white
g.setColor(0xFFFFFF);
g.fillRect(0,0,width,height);

Image logo=null;
try {
logo=Image.createImage("/images/logo.png");
} catch (Exception ignore) {}

g.drawImage(logo,width/2,height/2,g.HCENTER|g.VCENTER);
}



here's the calling method in your midlet(it passes the Display and current Displayable):

/**
* This shows the splash
*/

private void showSplash () {
new Splash (display,MenuList); 
}

还有一种办法是利用currentTimeMillis。
无非就是利用System.currentTimeMillis()+2000先行计算出什么时间该显示

后一幅图片了,如果靠while循环不断检测发现时间到了,就换那张图片。

 

private boolean showImage;


void someMethod()
{
long time = System.currentTimeMillis()+2000;

showImage = true;
while(System.currentTimeMillis()<time)
{
repaint();
serviceRepaints();
}
showImage = false;
}

public void paint()
{

if(showImage)
g.drawImage(img,offsetX,MAX_Y/2,g.LEFT|g.VCENTER);
}

 

efei说:
“你要做的无非就是一个延时,过一定时间就换一幅图片。至于怎么来判断这个延时,方法多种多样,用线程,用TimerTask,用System.currentTimeMillis(),基本上都一样

个人比较倾向于使用线程作为固定的时钟脉冲来驱动游戏。

对于System.currentTimeMillis(),我只能告诉你两点,一是它的作用是取得当前时间,二呢,用这个方法如果只是简单比较时间,那么如果中断游戏,过一段时间再恢复,就会存在问题。

时间: 2024-11-02 08:24:54

[JavaME]利用java.util.TimerTask来做Splash Screen的N种方法的相关文章

java实现斐波那契数列的3种方法_java

先说说为什么写这个吧,这个完全是由去阿里巴巴面试引起的一次惨目忍睹的血案.去面试的时候,由于面试前天晚上11点钟才到阿里巴巴指定面试城市,找到旅馆住下基本都1点多,加上晚上完全没有睡好,直接导致第二天面试效果很不好(对于那些正在找工作的大虾们不要向小虾一下悲剧,提前做好准备还是很重要滴),面试大概进行了一个多小时(面试结束回去的时候基本走路都快睡着了,悲催!!),面试快结束的时候面试官问的我问题就是关于费波那西数列,当时头脑完全浆糊,只知道要设置三个变量或者用List先初始化,当写到for循环的

java发送url请求获取返回值的二种方法_java

下面提供二种方法会使用java发送url请求,并获取服务器返回的值 第一种方法: 复制代码 代码如下: import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFor

Java删除ArrayList中的重复元素的2种方法

ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素,重复的元素,并保持元素的插入顺序.在编码时我们经常会遇 到那种必须从已建成的ArrayList中删除重复元素的要求.这篇文章将给出两种从ArrayList中删除重复元素的方法. 方法1:使用HashSet删除ArrayList中重复的元素 在该方法中,我们使用HashSet来删除重复的元素.如你所知,HashSet不允许有重复的元素.我们使用HashSet的这个属性来删除已建 成的ArrayList中的重复元素.

java中导出大量数据到Excel的一种方法

在Java Web开发中,经常需要导出大量的数据到Excel,使用POI.JXL直接生成Excel,很容易就造成内存溢出了. 1.有一种方式,就是把数据写成csv格式文件. 1)csv文件可以直接用Excel打开. 2)写csv文件的效率和写txt文件的效率一样高. 3)同样的数据内容,生成的csv文件的大小远远小于生成的Excel文件. 从以上优点就可以看出生成csv文件消耗的内存绝对小于生成Excel文件. 2.按一定的格式去生成csv文件,在Excel中打开的时候就是完整的行和列格式. 例

适合中小企业做搜索引擎营销的几种方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 相信这个话题很多人想知道,也相信很多人也在努力的实施和执行着.但是我在这里想说的是,大家真正的理解搜索引擎营销吗?真正的知道如何才能做好搜索引擎营销吗?明白如何通过搜索引擎营销让公司或者企业实现盈利吗?优赛SEO不才,今天就谈谈这个话题. 开始之前我还要谈谈搜索引擎营销这个概念,何谓搜索引擎营销?搜索引擎营销简称SEM,就是根据用户使用搜索引

新网站做宣传最好的八种方法

中介交易 SEO诊断 淘宝客 云主机 技术大厅 个人网站越来越多,据说现在中国个人站长已经超过了3200万.而且由于CN域名一元促销活动的推动,越来越多的网民走向了个人站长的道理.但是,网站建好了,怎么宣传呢?网站流量怎么来?制作网站,越来越易;推广网站,越来越难.下面给大家看一个网友推广新网站的经验吧.在这里列出一些自己感觉比较有用的方法,以供大家参考. 一.导航网站登陆 对于一个流量不大, 知名度不高的网站来说, 导航网站能给你带来的流量远远超过搜索引擎以及其他方法. 我对朋友的某某网做了下

Java中去除字符串中所有空格的几种方法

JAVA中去掉空格 1. String.trim() trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 复制代码 代码如下: String str = " hell o "; String str2 = str.replaceAll(" ", ""); System.out.println(str2); 3.或者replaceAll(" +&

Java中判断字符串是否为数字的五种方法 (转)

推荐使用第二个方法,速度最快. 方法一:用JAVA自带的函数 Java代码   public static boolean isNumeric(String str){      for (int i = str.length();--i>=0;){         if (!Character.isDigit(str.charAt(i))){        return false;       }      }      return true;    }   public static b

系统中做权限控制的三种方法各有什么优缺点?

问题描述 权限控制可以用Filter,可以用struts的pRequestProcessor,还可以用spring的AOP,但是他们各自的优缺点是什么呢? 解决方案 以下是本人的认识与理解,仅供参考! Filter: 优点 1 低耦合!权限管理模块与其他模块相对独立性较高. 2 工作任务相对小一点 缺点 技术性要求较高,易产生安全Bug其它:Struts的拦截器,spring的aop 优点:不易产生安全上的问题. 缺点:1 不用模式设计,会有大量的工作要做.每个要权限处理的类,要事先预留接口.