J2ME双缓冲技术

import javax.microedition.midlet.*;
/**
* @author Administrator
*/
public class Midlet extends MIDlet
{
    public void startApp()
    {
        Display.getDisplay(this).setCurrent( new ImageCanvas());
    }
    public void pauseApp()
    {
    }
    public void destroyApp( boolean unconditional )
    {
    }
}
======================================================
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class ImageCanvas extends Canvas
{
    private Image buffer;//可变图像,作为绘制缓冲
    private Image image;//不变图像,用来加载图片文件
    public ImageCanvas()
    {
        try
        {
            image = Image.createImage( "/monitor.png" ); //加载图片文件
        } catch( java.io.IOException e )
        {
            System.out.println( e.getMessage() );      //处理I/O异常
        }
        buffer = Image.createImage( this.getWidth(), this.getHeight() );
        //用一个可变图像作为绘制缓冲
        Graphics bg = buffer.getGraphics();        //获取缓冲的Graphics对象
        bg.setColor( 0xFFFFFF );
        bg.fillRect( 0, 0, getWidth(), getHeight() );    //填充整个屏幕
        bg.drawImage( image, this.getWidth() / 2, this.getHeight() / 2, Graphics.VCENTER | Graphics.HCENTER );
    }
    public void paint( Graphics g )
    {
        g.drawImage( buffer, 0, 0, g.TOP | g.LEFT );      //将缓冲区上的内容绘制到屏幕上
    }
}

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

双缓冲主要是用来解决屏幕闪烁以及绘图效率的问题,这里介绍下MIDP里面使用方法。

1、有一个函数可以判断设备是否实现了双缓冲:isDoubleBuffered(),如果返回true,表示设备自身实现了双缓冲,理论上说我们就不用再自己设置了。不过为了安全第一,大家普遍认同的做法是,不管设备有没有实现,我们都自己设置一个,反正多做没有坏处。

2、自己实现双缓冲代码如下:

// initialize:

Image bufferImage = null;

bufferImage=Image.createImage(scrW,scrH);

//in paint:

public void paint(Graphics g){

//双缓冲处理

Graphics old=null; //检查图片是否已经改变

if(bufferImage!=null){ g=bufferImage.getGraphics(); }//将bufferImage的Graphics对象赋给g

g.setColor(0x0); //设置背景色黑色

g.fillRect(0,0,scrW,scrH);//清除当前画面,准备绘制新画面

g.setColor(0xFFFFFF); //设置颜色为白色

g.drawString("Test double buffer",10,50,0);

if(g!=old){ //要是图片已经发生改变则将缓冲区图片一次性画到屏幕上去

old.drawImage(bufferImage,0,0,Graphics.LEFT|Graphics.TOP);

}

}

3、注意:某些BT的机器可能自己设置双缓冲会出问题,比如速度慢。

目前已发现的有SoftBank 3GC的少数机型,所以遇到特殊问题时,可以考虑去掉自己设置的双缓冲看看,反正手机硬件已经支持了。

*******************************************************************************

主要解决因为画面在显示的同时,程序又在改变它,而缠身的画面闪烁问题。解决方法是:在内存中开辟一片区域作为后台画面,程序对它更新,修改完成后再显示它,就是双缓冲技术。

       可以使用Canvas类中的isDoubleBuffer()方法判断设备是否有双缓冲。(支持MIDP2.0的机器都有)使用可变图象,可以很容易的用作屏幕外缓冲。将所有的绘制都放在可变图象中,然后一次性将可变图象绘制到屏幕上。

Image img =Image.createImage(“/要绘制的图象名.png”);//创建一个不可变图象

Image buffer = Image.createImage(width,height);//创建一个可变图象作为绘制缓冲

刚刚创建的buffer初始始一片不透明的白色区域,无法直接在可变图象中创建透明象素。在使用图象时,一般都需要提取该图象的Graphics对象,以便对可变图象进行修改。注意:只有可变图象才可以调用getGraphics()这个函数,如果时不变图象,调用这个方法会抛出IllegalStateException异常。

Graphics bg=buffer.getGraphics();//获取缓冲的Graphics 对象

bg.setColor( 颜色值 );//缓冲区的颜色

bg.fillRect(0,0,width,height);//填充整个屏幕

bg.drawImage(  img , width/2,height/2,g.VCENTER|g.HCENTER);

g.drawImage(buffer,0,0,g.TOP|g.LEFT);将缓冲区的内容绘制到屏幕上

      运行程序后,调整g.drawImage(buffer,0,0,g.TOP|g.LEFT);中绘制的起始坐标0,0位置,发现,缓冲区上绘制的“/要绘制的图象名.png”该图片,虽然绘制时候是g.VCENTER|g.HCENTER 居中,但是现在就随缓冲区移动,不在屏幕中心,而是缓冲图象的中心。

      总结:双缓冲技术是定义一个Graphics 对象bg和一个Image对象buffer,按屏幕大小建立一个缓冲对象赋给buffer的Graphics的对象bg。在这里 Graphics对象可理解为缓冲的屏幕,Image  对象可当作缓冲屏幕的图片。在bg(缓冲屏幕)上用draw方法等语句画图,相当于在缓冲屏幕上画图。最后在paint(Graphics g)函数里,将buffer(缓冲屏幕上的图片)画到真实屏幕上。  如果想要在屏幕上显示社那么东西,只要画在bg上,然后调用repaint()将其显示出来即可。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gumanren/archive/2009/10/12/4660165.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值