动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > J2EE/J2ME教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ J2EE/J2ME教程 ]的信息

本月文章推荐
.J2ME性能优化之—优化方法探讨.
.使用Oracle JDBC驱动.
.测试MySQL驱动的安装.
.如何用IIS来实现OTA下载.
.JSP+JavaScript实现类似MSDNCSDN.
.J2EE 应用服务器技术.
.了解J2ME可选包MMAPI.
.J2EE的13种核心技术(二).
.在J2ME/MIDP中实现图像旋转(一).
.用J2ME实现简单电子邮件发送功能.
.搭建OTA下载服务器.
.J2EE的13种核心技术(一).
.使用j2meunit进行游戏测试.
.M3G游戏中性能提升技巧.
.切入商业应用(一).
.如何避免文本被绘制到画布外面.
.详细介绍手机游戏中的声音处理.
.J2ME基础应用篇:如何将J2ME与XM.
.精通Hibernate映射继承关系之五.
.JSR-184里封装照相机的look-at方.

应用双缓冲技术解决画面闪烁的问题

发表日期:2007-12-23 |


    有些时候我们可能在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.HCENTERGraphics.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.LEFTGraphics.TOP);
        }

    }

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

    }


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

}

(出处:http://www.knowsky.com)


上一篇:第一个Spring MVC程序 人气:820
下一篇:UniJa2.1声音播放问题(MIDI格式)[原创] 人气:640
浏览全部J2EE/J2ME的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-12-2 晴天电影系统(带一键迅雷/自定义
2008-12-2 QQip138闪字程序
2008-12-2 SmartWeb企业智能建站系统 v1.0.2
2008-12-2 梦想不死个人主页 v2009
2008-12-2 开良ASP小偷程序生成器 v1.1
2008-12-1 MyBB v1.4.4 简体中文版 bulid 2
2008-12-1 新云网站内容管理系统 v4.0.0.11
2008-12-1 网趣网上购物系统时尚版 v8.8
2008-12-1 Textpattern v4.0.7 多国语言版
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
2008-11-29 Opera 9.62 Build 10469
2008-11-29 MPlayer WW编译版 SVN-r28044(20
2008-11-29 NetTools网络工具v1.0.0破解版
2008-11-29 3DGallery三维体验1.1破解版
2008-11-29 SecretBook保密本v1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成