为什么只使用一个canvas? 1. 节省内存空间 2. 页面跳转逻辑简单,方便管理 3. 每个页面中有许多相同的元素和函数需要抽象 如何实现单个canvas的低级界面设计? 1. 抽象每一个界面的类: .public abstract class AbstractForm { public AbstractForm(){ } public abstract void print(Graphics g); public abstract void keyPress(int keyCode,int actionCode); } 2. 具体界面实现类 public class MainForm extends AbstractForm { public MainForm() { this.init(); } private void init() { } /* 主页面的绘制函数 * */ public void print(Graphics g) { } public void keyPress(int keyCode,int actionCode) { if (keyCode==CONST.RIGHTSOFTKEY){// 点击右软键响应的操作 System.out.println(" right is presssed"); } else if (keyCode==CONST.LEFTSOFTKEY){// 点击左软键响应的操作 System.out.println(" left is presssed"); } } } public class MessageForm extends AbstractForm { public MessageForm(String strNextForm ,String message){ } public void print(Graphics g) { } public void keyPress(int keyCode, int actionCode) { if (keyCode == CONST.LEFTSOFTKEY){ } } } 3. canvas登场: public class MyCanvas extends Canvas { private static AbstractForm currentForm; public static int formHeigth; public static int formWidth; public static Vector data = new Vector(); private static MyCanvas ui; private MyCanvas(){ this.setFullScreenMode(true); formHeigth=this.getHeight(); formWidth=this.getWidth(); DataManager.getDataManager().loadData(); //设定初始页面为主页面:MainForm currentForm=new MainForm(); } public static MyCanvas getMyCanvas(){ if (ui == null){ ui = new MyCanvas(); return ui; } else { return ui; } } protected void paint(Graphics g) { Font font =Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE); g.setFont(font); this.setFullScreenMode(true); this.clearScreen(g); currentForm.print(g); } /* 清屏函数每一次重画的时候调用 * */ private void clearScreen(Graphics g){ int oldC = g.getColor(); g.setColor(0xffffff); g.fillRect(0, 0, this.getWidth(), this.getHeight()); g.setColor(oldC); } public void keyPressed(int keyCode){ currentForm.keyPress(keyCode,this.getGameAction(keyCode)); this.repaint(); } public static void setCurrentForm(AbstractForm myForm){ currentForm = myForm; } } 使用多态原理,print 和 按键响应 两个事件