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