j2me中,将屏幕上某一区域的颜色进行反转

如果自己使用低级UI的时候,比如说在Canvas上使用Button,则在Ok键按下之后,就要自己来处理颜色的改变,比如说将颜色反转。

Graphics类中有drawRGB方法,用该方法可以将指定的区域设为特定的颜色数据。

这个方法的声明如下:

void drawRGB(int[] rgbData, int offset, int scanlength, int x, int y, int width, int height, boolean processAlpha);

参数的意义分别为:

rgbData: 有效的数据,即要写到某个区域的颜色数据信息

offset:有效数据在rgbData中的起始位置

scanlength: 扫描行的宽度,即要写的数据的宽度,这个值一般与后面的width相同

x: 表示区域开始的x坐标

y: 表示区域开始的y坐标

width:这个区域的宽度

height: 这个区域的高度

processAlpha:是否使用alpha (这个我设为TRUE或FALSE没看到有什么影响,不知道是怎么回事)

所以,将屏幕上原来的数据取下来之后,用0x00ffffff进行异或,就可以得到取反后的数据,然后将这个数据用drawRGB重新写到屏幕上就可以实现反转了。

 

但怎么从屏幕上取得原来的数据,这个还有点麻烦

 

使用双缓冲就是解决办法之一,其实只是将图画在一个全局Image上面,可以首先创建一个Image,然后用getGraphics方法来获取Graphics,然后在paint里面全都画到这个Graphics上,最后在paint方法要返回的时候,一次性再用Graphics的drawImage方法把那个全局Image画出来。

这样,在别处就可以使用那个全局Image所对应的Graphics了。在Image里面有个getRGB方法,它的参数类似于Graphics里面的drawRGB,用这个getRGB来取得原来的数据,将颜色数据进行反转,然后再写回去,这样就可以将某个区域的颜色进行反转了。

 

下面是简单的示例代码:

Graphics globalG; Image bufferImage; bufferImage = Image.createImage(getWidth(),getHeight()); globalG = bufferImage.getGraphics(); //将globalG设为与Image关联的Graphics //在paint中的处理如下 : protected void paint(Graphics g) { //Something code here g.drawImage(bufferImage, 0, 0, Graphics.TOP | Graphics.LEFT); //如果bufferImage在别处被改变了,然后repaint一下,则这个函数会被调用 } //将数据反转的处理代码 private void reverseProcess(int sel) { // TODO Auto-generated method stub int rgbData[] = new int[rtWidth * rtHeight]; //rtWidth和rtHeight是要改变区域的宽和高 bufferImage.getRGB(rgbData, 0, rtWidth, rtX, rtY, rtWidth, rtHeight); //将每个颜色反转,然后再写回去 int num = rtWidth * rtHeight; for (int i = 0; i < num; i++) { rgbData[i] = rgbData[i] ^ 0x00ffffff; //将后面的rgb位取反 } //写回 globalG.drawRGB(rgbData, 0, rtWidth, rtX, rtY, rtWidth, rtHeight, true); repaint(); }

 

btw: 用j2me写普通的应用软件界面真是麻烦……

你可能感兴趣的:(UI,image,button,j2me)