LWUIT顯示漂亮的loading界面的兩種方法

關鍵字: lwuit 等待

    轉載:https://p-blog.csdn.net/images/p_blog_csdn_net/pjw100/EntryImages/20091123/lwuit_0002.jpg

 

  當我們加載某一個Form頁面時,如果這個頁面內容較多,加載需要一定的時間,那我們就希望做一個等待的畫面,比如"某某正在加載,請等待...",在這個畫面中以動態效果來說爲最好,用戶也知道需要等待很短的時間。我做等待界面有兩種方法:首先是方法一,這種方法屬於文字等待,就是在界面上畫一串文字,"..."是以動態的形式顯示,代碼如下:

 


/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
import com.sun.lwuit.Font; 
import com.sun.lwuit.Form; 
import com.sun.lwuit.Graphics; 
import com.sun.lwuit.Image; 
import com.sun.lwuit.Label; 
import com.sun.lwuit.layouts.BorderLayout; 
import java.io.IOException; 
import java.util.Random; 
import java.util.Timer; 
import java.util.TimerTask; 
/** 

* @author Administrator 
*/ 
public class TextLoading extends Form implements Runnable { 
private Timer timer = new Timer(); 
private long displayTime = 1000; 
private StringBuffer loading = new StringBuffer("Saleslion is loading"); 
public TextLoading() { 
Thread t = new Thread(this); 
t.start(); 
this.setLayout(new BorderLayout()); 
this.show(); 

public void paint(Graphics g) { 
try { 
Image wait = Image.createImage("/logo.png"); 
//繪製logo 
g.drawImage(wait, (getWidth() - wait.getWidth()) / 2, (getHeight() - wait.getHeight()- 70) / 2); 
g.setColor(0xffffff); 
Font fnt = Font.createSystemFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_LARGE); 
g.setFont(fnt); 
int wordWidth = fnt.stringWidth("Saleslion is loading..."); 
//繪製等待字符串 
g.drawString(loading.toString(), (getWidth() - wordWidth) / 2, (getHeight() + wait.getHeight() -60) / 2); 
} catch (IOException ex) { 
ex.printStackTrace(); 


private void disappear() { 
timer.cancel(); 
try { 
new LoginForm(); 
} catch (IOException ex) { 
ex.printStackTrace(); 


//調用TimerTask,時間到了後,調用disappear(),當前畫面消失,跳至另一個Form 
protected void showNotify() { 
timer.schedule(new TimerTask() { 
public void run() { 
disappear(); 

}, displayTime); 

//設置字符串 
public void setLoading() { 
if (loading.toString().indexOf("...") > 0) { 
loading.delete(loading.length() - 3, loading.length()); 


public void run() { 
while (true) { 
try { 
//調用線程來繪製字符串 
Thread.sleep(500); 
setLoading(); 
loading.append("."); 
} catch (Exception e) { 

repaint(); 


}

 

 

 

以上代碼比較簡單,也不做多的解釋,它是基於Form的。

但是這並不是我想要的效果,假如在一個九宮格中,我點擊某一格時,我希望出現一個loading畫面顯示正在加載這一項,但是以遮罩的形式顯示(就像web開發裏面彈出的遮罩層對話框一樣),也就是說,彈出loading時,我仍然能夠見到原來的九宮格畫面。我要的效果如下圖:

 

 如果要實現這種形式的loading畫面,只有通過Dialog類來實現。

製作這種Dialog有幾個小問題需要解決:

1.lwuit中如何顯示gif動畫

2.Dialog全透明

3.Dialog自動釋放

一直沒有實現這個效果,關鍵是問題1,但是在上一節 我已經解決了,下面就看關鍵代碼,代碼仍然很簡單:

 


/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package com.thinkrace.UCHome.ui; 
import com.sun.lwuit.Dialog; 
import com.sun.lwuit.Display; 
import com.sun.lwuit.Image; 
import com.sun.lwuit.Label; 
import com.sun.lwuit.util.Resources; 
import java.io.IOException; 
/** 

* @author Administrator 
*/ 
public class LoadingDialog extends Dialog { 
public LoadingDialog() { 
try { 
//設置對話框全透明 
for (int i = 0; i < getComponentCount(); i++) { 
getComponentAt(i).getStyle().setBgTransparency(0); 

Image icon = Resources.open("/resources.res").getImage("loading.gif"); 
Label l = new Label(icon); 
l.getStyle().setBgTransparency(0); 
addComponent(l); 
int w = Display.getInstance().getDisplayWidth(); 
int h = Display.getInstance().getDisplayHeight(); 
int top = (h - icon.getHeight()) / 2 - 10; 
int left = (w - icon.getWidth()) / 2 - 10; 

setTimeout(3000); 
show(top,top,left,left,false); 

} catch (IOException ex) { 
ex.printStackTrace(); 


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章