通常在做各种手机应用时,为了实现出非常绚丽的UI界面,就会使用很多图片来自定义UI,这样当一个应用做完时,发现应用程序包已经变得很大了,玩家也肯定不喜欢过大的应用软件包,那么我们需要对这些图片进行压缩,当然压缩的方式很多,网上也能找到很多用来压缩png图片的工具,这里我们就不浪费时间来介绍这些压缩工具的使用了。
另外,当应用中使用的图片过多时,管理维护也不方便,最好的解决方案就是能将使用的所有资源打包成一个文件。最后,当应用程序被打包成jar之后,用户能够用过解压缩工具很容易就看到游戏中的图片,这样游戏很快就能被破解,作为开发者,我们肯定不愿看着自己的应用被盗版!本文我们将介绍一种资源打包的方式,可以有效的管理资源,方便维护,并且防止应用被破解。
使用BinCompiler打包资源
BinCompiler工具可以将应用中的资源打包成二进制文件,然后在程序中读取该二进制资源文件并使用,无论有多少图片BinCompiler都能打包成一个单独的二进制文件。下面我们介绍BinCompiler工具的使用方法。
首先,运行“BinCompiler.exe”,指定要打包的资源文件的路径,和输出二进制文件的路径,如下图所示。
点击create按钮,即在我们制定的位置产生一个bin文件,当然在这个bin文件所在目录还会产生一个index.txt文件。我们在程序中读取这些资源时,需要使用这个index.txt。index.txt文件如下所示:
FName
Index Pos Size
A_04.png
0 0 4141
A_03.png
1 4145 3802
A_02.png
2 7951 3813
A_01.png
3 11768 3959
接下来我们可以使用BinReader.java文件中的两个方法来读取这些资源文件了。代码如下:
/*******************************************************************************
* Reads a file from the BIN file and return data as a byte buffer
*******************************************************************************/
public byte[] readFile(String binfile, int pos)
{
byte buffer[];
int len;
try {
InputStream is = Class.getClass().getResourceAsStream("/" + binfile);
is.skip(pos);
len = (is.read() & 0xFF) << 24;
len |= (is.read() 0xFF) << 16;
len |= (is.read() & 0xFF) << 8;
len |= (is.read() & 0xFF);
buffer = new byte[len];
is.read(buffer, 0, buffer.length);
is.close();
is = null;
System.gc();
} catch (Exception e) {
buffer = null;
e.printStackTrace();
System.gc();
return null;
}
return buffer;
}
/*******************************************************************************
* Reads a file from the BIN file and return data as an Image
*******************************************************************************/
public Image readImage(String binfile, long pos)
{
byte buffer[];
long len;
try {
InputStream is = Class.getClass().getResourceAsStream("/" + binfile);
is.skip(pos);
len = (is.read() & 0xFF) << 24;
len |= (is.read() & 0xFF) << 16;
len |= (is.read() & 0xFF) << 8;
len |= (is.read() & 0xFF);
buffer = new byte[len];
is.read(buffer, 0, buffer.length);
is.close();
is = null;
System.gc();
} catch (Exception e) {
buffer = null;
e.printStackTrace();
System.gc();
return null;
}
return Image.createImage(buffer, 0, buffer.length);
}
可以看出,这两个方法都只需要传入bin文件名和图片对应的pos,pos值就在我们上面所说的index.txt文件中去找对应的就可以了。
例如我们读取一个图片
Image image = readimage("images.bin", 0);
可以看出,我们传入的pos的值是0,对应index.txt中就应该是A_04.png。
通过BinCompiler工具将资源进行打包,应用程序包中就只包含了一个被BinCompiler打包出来的bin文件,在也看不到图片文件了,可以有效的防止图片被破解和盗用。另外,BinCompiler工具不仅可以打包图片资源,音乐,音效都可以被打包,用同样的方式读取即可在程序中使用。
关于JavaME中UI设计的部分就介绍到这里,希望能够对大家的开发有一定的帮助。最后需要说明一下,现在有很多第三方的开源UI库(比如:LWUIT、J2MEPolish等),利用这些UI库可以更加简单的做出更漂亮的UI界面,弥补了JavaME中UI api的缺点和不足!