问题
每个使用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类别不是执行绪安全,不同执行绪的同时存取会造成不可预测的结果,所以假如一个应用程式从不同的执行绪存取这个类别那麽存取它应该是同步的。
分享到:
相关推荐
可以画出直线、矩形、圆角矩形、三角形、文字等,把缓冲区图像的内容绘制到画布上,重载抽象类MIDlet的抽象方法startApp(),重载抽象类MIDlet的方法destroyApp(),Java Canvas绘图程序,新手必看代码。
Canvas绘图程序Java源码,可以用来画直线、矩形、圆角矩形、三角形、文字等,把缓冲区图像的内容绘制到画布上
微信小程序源码 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)(学习版)微信小程序源码 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)(学习版)微信小程序源码 小程序完整demo:飞翔的...
资源名称:HTML5 Canvas基础教程内容简介:《HTML5 Canvas基础教程》从HTML5和Javascript(以及jQuery)的基础知识讲起,全面介绍了HTML5 Canvas的各种特性,包括渲染上下文、坐标系统、绘制图形、保存和恢复...
使用低级用户界面技术制作j2me应用程序的欢迎界面的方法
We-Canvas 1.We-Canvas之WaveImage 效果图: 实现细节: 1.js: drawImage:function(data){ var that = this var p10= data[0][0]; /* 三阶贝塞尔曲线起点坐标值*/ var p11= data[0][1]; /* 三阶贝塞尔曲线第一...
第1章 什么是Java程序设计语言 1 1.1 Java语言诞生背景 1 1.2 Java语言的特点 1 1.2.1 可移植性(universality) 1 1.2.2 安全性(security) 1 1.2.3 Java Virtual Machine(JVM) 2 1.2.4 面向对象的程序...
wxml-to-canvas 小程序内通过静态模板和样式绘制 canvas ,导出图片,可用于生成分享图等场景
《HTML 5 Canvas基础教程》从HTML5和JavaScript(以及jQuery)的基础知识讲起,全面介绍了HTML5Canvas的各种特性,包括渲染上下文、坐标系统、绘制图形、保存和恢复画布状态,以及变形、合成、处理图像和视频等,让...
小程序canvas,需要到project.config.json文件添加你自己的appid,在request请求中填写你的图片上传路径
《HTML5 Canvas基础教程》从HTML5和JavaScript(以及jQuery)的基础知识讲起,全面介绍了HTML5 Canvas的各种特性,包括渲染上下文、坐标系统、绘制图形、保存和恢复画布状态,以及变形、合成、处理图像和视频等,让...
【微信小程序-毕设期末大作业】飞翔的小鸟小程序游戏,基于canvas实现,含java后端源码 【微信小程序-毕设期末大作业】飞翔的小鸟小程序游戏,基于canvas实现,含java后端源码 【微信小程序-毕设期末大作业】飞翔的...
小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221).zip微信小程序模板源码
微信小程序 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221) (源码)微信小程序 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221) (源码)微信小程序 小程序完整demo:飞翔的小鸟:canvas...
HTML5 Canvas基础教程
微信小程序canvas原生定制名片
【微信小程序-毕设期末大作业】canvas涂鸦小程序(含node后端源码)【微信小程序-毕设期末大作业】canvas涂鸦小程序(含node后端源码)【微信小程序-毕设期末大作业】canvas涂鸦小程序(含node后端源码)【微信小...
HTML5 Canvas基础教程源代码
微信小程序源码(含截图)小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)微信小程序源码(含截图)小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)微信小程序源码(含截图)小程序完整...
先看下微信小程序canvas拖拽功能 组件地址 github.com/jasondu/wx-… readme近期补上 实现效果 如何实现 使用canvas 使用movable-view标签 由于movable-view无法实现旋转,所以选择使用canvas 需要解决的问题 ...