积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> 嵌入式软件 >> JAVA
  相关分类: LINUX | WINCE | UC/OS | Bootloader | 下载 | VXWORKS | 网络协议 | JAVA | 汇编 | 驱动设计 | Symbian | XP Embedded | Nucleus | 新产品 | 相关文章 | 综合技术 |
应用双缓冲技术解决J2ME画面闪烁的问题
 
作者:mingjava   来源:网络    点击数:883   更新时间:2006-9-1
您可以添加到网摘 让更多人关注此文章:

    有些时候我们可能在J2ME中遇到画面闪烁的问题,这时候我们可以应用双缓冲的技术来解决,不过由于现在越来越多的手机自身就支持双缓冲了。所以这里只做个简单的介绍。

    我写了程序本来想在NOkia 6108上比较用和不用的区别,结果这个手机自己就支持双缓冲,所以根本没有比较出来。不过了解这个技术还是有必要的,所以我决定还是写出来。双缓冲本来是在开发PC应用程序的时候遇到的。在MIDP开发中同样存在,当你在屏幕上进行原始写画的时候,如果很复杂的话,用户会发现界面在闪烁。因此你可以这样做,首先在另一个图片上进行paint()得操作,当完成了以后就把它copy到屏幕上,由于通常copy得时候速度很快就不会出现闪烁了。这个技术就是双缓冲。

     Canvas类提供了isDoubleBuffered()方法来判断设备是不是支持这个功能,如果返回true的话,那么我们就没有必要使用双缓冲了,如果false的话,我们可以这么做:
public DoubleCanvas(UIController uicontroller)
    {
        super();
        this.uicontroller = uicontroller;
        width = this.getWidth();
        height = this.getHeight();
        this.setCommandListener(this);
        if(!isDoubleBuffered())
        {
            offImage = Image.createImage(width,height);
        }

            
           }

    
    protected void paint(Graphics arg0)
    {
        
        arg0.drawString(isDoubleBuffered()+"",width/2,height/2,Graphics.HCENTER|Graphics.TOP);
        Graphics saved = arg0;
        if(offImage != null)
        {
            arg0 = offImage.getGraphics();
        }
        arg0.setColor(255,128,128);
        for(int i = 2,j=2;i<width/2-6&&j<height/2-6;i=i+2,j=j+2)
        {
            arg0.drawRect(i,j,width-2*i,height-2*j);
        }
        if(arg0 != saved)
        {
            saved.drawImage(offImage,0,0,Graphics.LEFT|Graphics.TOP);
        }

    }

得到offImage得Graphics实例后,进行paint()得操作。这个部分通常比较复杂,我这里的不够复杂:)
然后把offImage直接copy到屏幕上也就是执行
saved.drawImage(offImage,0,0,Graphics.LEFT|Graphics.TOP);

      我写了一个应用程序来比较使用和不使用双缓冲的效果,但是由于我的手机支持双缓冲所以看不出效果,如果你有兴趣,那么可以把paint()部分的代码修改的复杂一些然后再移植到不支持的手机上也许可以看出效果,下面是我程序的代码:

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


public class DoubleBufferMIDlet extends MIDlet
{
    private UIController uicontroller;
   
    protected void startApp() throws MIDletStateChangeException
    {
        uicontroller = new UIController(this);
        uicontroller.init();

    }

      protected void pauseApp()
    {
     

    }

   
    protected void destroyApp(boolean arg0) throws MIDletStateChangeException
    {
    
    }

}

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;


public class MainListUI extends List implements CommandListener
{

    private UIController uicontroller;
   
   
    public MainListUI(UIController uicontroller)
    {
        super("Test",List.IMPLICIT);
        this.uicontroller = uicontroller;
        this.append("Non-buffer",null);
        this.append("Double-buffer",null);
        this.setCommandListener(this);
    }
   
    public void commandAction(Command arg0, Displayable arg1)
    {

        if(arg0 == List.SELECT_COMMAND)
        {
            if(this.getSelectedIndex() == 0)
            {
               
                uicontroller.handleEvent(UIController.EventID.DISPLAY_NON_BUFFER);
            }
            else
            {
               
                uicontroller.handleEvent(UIController.EventID.DISPLAY_BUFFER);
            }
        }
       

    }

}

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;


public class UIController implements CommandListener
{

    private Display display;
    private DoubleBufferMIDlet midlet;
    private MainListUI mainList;
    private NonDoubleCanvas noDoubleCanvas;
    private DoubleCanvas doubleCanvas;
    public static final Command backCommand = new Command("Back",Command.BACK,2);
   
    public static class EventID
    {
        public static final int DISPLAY_NON_BUFFER = 0;
        public static final int DISPLAY_BUFFER = 1;
    }
    
  
    public UIController(DoubleBufferMIDlet midlet)
    {
        this.midlet = midlet;
    }
   
    public void init()
    {
        display = Display.getDisplay(midlet);
        mainList = new MainListUI(this);
        noDoubleCanvas = new NonDoubleCanvas(this);
        doubleCanvas = new DoubleCanvas(this);
        addCommand();
        display.setCurrent(mainList);
    }
   
    public void addCommand()
    {
        noDoubleCanvas.addCommand(backCommand);
        doubleCanvas.addCommand(backCommand);
    }
   
    public Display getDisplay()
    {
        return display;
    }
   
    public void setCurrent(Displayable disp)
    {
        display.setCurrent(disp);
    }
   
    public void handleEvent(int eventID)
    {
        switch(eventID)
        {
            case EventID.DISPLAY_BUFFER:
            {
                setCurrent(doubleCanvas);
                System.out.println(EventID.DISPLAY_BUFFER);
                break;
            }
            case EventID.DISPLAY_NON_BUFFER:
            {
                setCurrent(noDoubleCanvas);
                System.out.println(EventID.DISPLAY_NON_BUFFER);
                break;
            }
        }
    }
    public void commandAction(Command arg0, Displayable arg1)
    {
       
        if(arg0 == backCommand)
        {
            display.setCurrent(mainList);
        }

    }


}

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;


public class NonDoubleCanvas extends Canvas implements CommandListener
{
    
    private UIController uicontroller;
    private int width;
    private int height;
  
    public NonDoubleCanvas(UIController uicontroller)
    {
        super();
        this.uicontroller = uicontroller;
        width = this.getWidth();
        height = this.getHeight();
        this.setCommandListener(this);
    }

  
    protected void paint(Graphics arg0)
    {
       
        arg0.setColor(100,100,100);
        arg0.drawString(isDoubleBuffered()+"",width/2,height/2,Graphics.HCENTER|Graphics.TOP);
        for(int i = 2,j=2;i<width/2-6&&j<height/2-6;i=i+2,j=j+2)
        {
            arg0.drawRect(i,j,width-2*i,height-2*j);
        }

    }


    public void commandAction(Command arg0, Displayable arg1)
    {
        
        uicontroller.commandAction(arg0,arg1);
    }

}

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;


public class DoubleCanvas extends Canvas implements CommandListener
{

    
    private UIController uicontroller;
    private Image offImage;
    private int width;
    private int height;
    
    public DoubleCanvas(UIController uicontroller)
    {
        super();
        this.uicontroller = uicontroller;
        width = this.getWidth();
        height = this.getHeight();
        this.setCommandListener(this);
        if(!isDoubleBuffered())
        {
            offImage = Image.createImage(width,height);
        }
            
       
    }

  
    protected void paint(Graphics arg0)
    {
        
        arg0.drawString(isDoubleBuffered()+"",width/2,height/2,Graphics.HCENTER|Graphics.TOP);
        Graphics saved = arg0;
        if(offImage != null)
        {
            arg0 = offImage.getGraphics();
        }
        arg0.setColor(255,128,128);
        for(int i = 2,j=2;i<width/2-6&&j<height/2-6;i=i+2,j=j+2)
        {
            arg0.drawRect(i,j,width-2*i,height-2*j);
        }
        if(arg0 != saved)
        {
            saved.drawImage(offImage,0,0,Graphics.LEFT|Graphics.TOP);
        }

    }


    public void commandAction(Command arg0, Displayable arg1)
    {
         uicontroller.commandAction(arg0,arg1);
    }

}



相关文章
· 科技奥运与计算机技术的应用[405]
· Electromedical[2669]
· 患者监控[2726]
· 基于TMS320LF2407A DSP的心电监护系统研究[3166]
· 用S3C2410实现三导联远程心电监护系统[3083]
热门评论排行
·VHDL设计中电路简化问题的
·ARM嵌入式系统基础教程(N
·江苏嵌入式Linux教育培训
·ARM处理器应用开发4步骤
·锐极LINUX驱动培训班定于

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
避免危及半导体业 德出手挽
HP实验室展示集CMOS电路与忆阻器
全球第二大代工巨头伟创力瘦身应对金融
Vishay Silico
奥地利微电子发布全球首款具有嵌入式比
采用 4mm x
未来MEMS产业恐缩水 车
iSuppli发布08年半导体厂商初
飞兆半导体指控英飞凌专利侵权
全球三大晶圆代工巨头齐遇冷 
 
热门下载 [更多]
 
[ PCB设计] Protel99教程下载
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
 
论坛新帖 [更多]
 
嵌入式十三法则...
基于CPLD和单片机的任意波形...
电子行业的发展方向...
单片机-超低价专业PCB打样...
超低价专业PCB打样 双面板...
[原创]主题:移动开发平台的建...
[原创]正弦脉宽调制(SPWM...
[推荐]Agilent8590...
[推荐]HP8591E HP8...
[推荐]Agilent8711...

 
赞助商 [更多]
 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网