×
Namespaces

Variants
Actions

Java ME Canvas基礎應用程式的設計樣式

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

文章
hamishwillee 在 13 Aug 2013 创建
最后由 hamishwillee 在 14 Aug 2013 编辑

Contents

問題

每個使用Java ME工作的人必定會碰到在切換可顯示的物件時這個“一閃而過(flicker)”的問題,例如從已經在View的一個畫布設定一個新的畫布,你會仔細想過可顯示的畫布不應該一次又一次地設定,我們在整個應用程式中應該只使用一個畫布設定,而這樣會產生一個長期不可管理的Canvas類別,這個類別會有很長的鍵盤按下/釋放、繪製方法及一堆的Switch case / if then else等等,這樣可會影響程式的效率及可讀性。

解決方案

我們必須以這樣的一個方式設計一個解決方案,這個方案就是只有一個Canvas(BaseCanvas – 鍵下面的程式碼)只有一次被midlet設為目前可顯示的,且對不同的應用程式模組使用物件導向方法來建構不同的Canvas螢幕,這些模組可以藉由一個共同的介面類別物件在BaseCanvas傳遞而不用flicker,每個螢幕處理繪製及式鍵的程式碼用這樣不同的螢幕類別來分隔,這樣可因此變得較易閱讀及效率。

優點

  • 容易擴展
  • 教友效率的程式碼
  • 較可閱讀的程式碼
  • 較低的記憶體佔用

程式碼

BaseCanvas會在下面

import javax.microedition.lcdui.*;
public class BaseCanvas extends Canvas
{
/**Singleton Instance**/
private static BaseCanvas mCanvas;
 
/** Singleton Accessor Method with lazy initialization**/
public static Canvas getCanvas()
{if(mCanvas==null)
mCanvas=new BaseCanvac();
return mCanvas;
}
 
public CanvasScreen setCurrentScreen(CanvasScreen aCs)
{
CanvasScreen old=mCs;
mCs=aCs;
return old;
}
 
public void paint(Graphics g)
{
if(null!=mCs) mCs.paint(g);
}
 
public void keyPressed(int keyCode)
{
if(null!=mCs) mCs.keyPressed(keyCode);
}
 
public void keyRepeated(int keyCode)
{
if(null!=mCs) mCs.keyRepeated(keyCode);
}
 
/**Stratergy Object **/
private CanvasScreen mCs=null;
 
private BaseCanvas()
{
setFullScreenMode(true);
}
}

CanvasScreen介面會在下面

import javax.microedition.lcdui.*;
public interface CanvasScreen
{
public void paint(Graphics g);
public void keyPressed(int keyCode);
public void keyRepeated(int keyCode);
}

所有應用程式不同的模組的其他螢幕或canvas類別會在下面
(例如,SplashScreen)

import javax.microedition.lcdui.*;
public class SplashScreen implements CanvasScreen
{
BaseCanvas bc;
public SplashScreen()
{
this.bc=BaseCanvas.getCanvas();
bc.setCurrentScreen(this);
// do what you want to paint on splash screen and load your assests.
}
 
public void keyRepeated(int keyCode){ }
 
public void paint(Graphics g)
{
// paint your Splash Screen
// paint Loader(g);
}
 
 
public void keyPressed(int keyCode)
{
// do what you need
}
 
private void repaint()
{
bc.repaint();
}
}

所有其他的螢幕類別將實做CanvasScreen介面,來執行他們自己的繪製及事件處理。

執行緒的安全

上面所說的存取BaseCanvas類別不是執行緒安全,不同執行緒的同時存取會造成不可預測的結果,所以假如一個應用程式從不同的執行緒存取這個類別那麼存取它應該是同步的。

--Linux achi於2009/9/15 15:38翻譯.


相关链接

This page was last modified on 14 August 2013, at 06:31.
130 page views in the last 30 days.
×