本文介绍如何将手机屏幕的内容存储为image对象,这里认为手机屏幕上显示的是一个canvas。完成这一个功能的思想就是使用缓冲机制。我们不能直接获得canvas上的像素,因此不能直接从canvas上的内容获得image对象。转换一下思路,如果把要绘制的canvas上的内容首先绘制到一个image上,而这个image并不显示到屏幕上,只是在绘画完成后一次性的显示到屏幕上。有经验的朋友一定联想到了双缓冲机制,不过这里并不是要使用双缓冲解决闪屏的问题,而是要得到当前canvas的内容。
下面我们编写一个简单的canvas类来测试一下这个想法,simplecanvas是canvas的子类,为了保存canvas的内容,我们创建一个image,大小与canvas的尺寸相当。
| class simplecanvas extends canvas{ int w; int h; private image offimage = null; private boolean buffered = true; public simplecanvas(boolean _buffered){ buffered = _buffered; w = getwidth(); h = getheight(); if(buffered) offimage = image.createimage(w,h); } protected void paint(graphics g) { int color = g.getcolor(); g.setcolor(0xffffff); g.fillrect(0,0,w,h); g.setcolor(color); graphics save = g; if(offimage != null) g = offimage.getgraphics(); //draw the offimage g.setcolor(128,128,0); g.fillroundrect((w-100)/2,(h-60)/2,100,60,5,3); //draw the offimage to the canvas save.drawimage(offimage,0,0,graphics.top|graphics.left); } public image printme(){ return offimage; } |
可以看到paint()方法,并不是直接对canvas操作,而是先把要画的内容绘制到一个image上,然后再绘制到canvas上。这样到你想抓取屏幕内容的时候就可以调用printme()方法了,返回offimage。编写一个midlet测试一下这个效果。
| package com.j2medev; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /** * * @author mingjava * @version */ public class printscreen extends midlet implements commandlistener{ private display display = null; private simplecanvas canvas = new simplecanvas(true); private command printcommand = new command("print",command.ok,1); public void startapp() { if(display == null) display = display.getdisplay(this); canvas.addcommand(printcommand); canvas.setcommandlistener(this); display.setcurrent(canvas); } public void pauseapp() {} public void destroyapp(boolean unconditional) {} public void commandaction(command command, displayable displayable) { if(command == printcommand){ form form = new form("screen"); form.append(canvas.printme()); display.setcurrent(form); } } } |
运行printscreen,选择print,即可把当前的屏幕显示到一个form中。如下图所示:
|

闽公网安备 35060202000074号