1.重绘和强制重绘
在用J2ME的低级UI时,所有的界面绘制要靠自己来实现,主要是在paint消息中来做,这里涉及几个接口:paint,repaint,serviceRepaints,callSerially,
paint
paint相当于是个回调函数,被J2ME主线程(处理UI和事件)来调用,任何时候我们都不能自己直接调用paint,程序在paint里面按部就班的画出界面即可,paint会带一个Graphics参数,用这个graphics去作图就可以了。
现在的很多J2ME平台已经默认支持双缓冲,所以在paint执行时,实际上界面并没有画出,而是等到paint执行完成后,一次性刷新到屏幕上的,不过这是和平台相关的。
repaint
这个是通知系统,我们需要刷新界面了,但仅仅是个通知,repaint会立即返回(无阻塞),paint会在合适的时候被系统调用,所以paint和repaint不是一一对应的,有一个repaint并不意味着一定会触发一个paint,多个repaint可能会被合并到一个paint调用。
如果在paint里面调用repaint,那么就意味着这个paint结束后会被再次调用,这在有些需要连续不段的刷屏的程序中可能有用,不过显然不太合适,比如下面这种代码。public void paint (Graphics g) {
repaint();
}
serviceRepaints
如果调用serviceRepaints,则会直接立刻重绘界面,阻塞式调用,直到paint完成。所以如果我们写出下面的paint接口:public void paint (Graphics g) {
repaint();
serviceRepaints();
}
后果相当于递归调用,并很快造成内存耗尽(Out of memory)异常,因为serviceRepaints里面又会直接调用paint(),所以使用serviceRepaints一定要小心,可以在某些地方使用serviceRepaints,但绝不能在paint里面调用。
callSerially
这个接口可以将一个Runable的接口抛在系统队列尾部,处理完消息之后,执行这个Runable接口的run,这在有些使用paint绘制的程序中会用到,可以在paint完以后,通过callSerially触发run接口,表示界面已经画完,可以做别的事情了,又不会阻塞系统队列。
2.可视性通知
Protected void hideNotify()
Protected void showNotify()
当Canvas被隐藏和显示的时候,两个方法被自动被系统调用。Canvas子类也可以通过重写这些方法来进行这些通知信息的接收工作。
3.坐标变换和图形剪裁
Graphics 提供了以下方法来进行坐标变换:
Public void translate(int x,int y)
Public int getTranslateX()
Public int getTranslateY()
当translate被调用时,偏移量被加到每个X和Y坐标轴上,当前的原点可以通过getTranslateX和getTranslateY方法得到
MIDP系统存在一个单一的裁剪,提供了当前的裁剪矩形和一个给定矩形相交(clipRect)以及完全设置裁剪矩形(setClip)的操作。图形操作所涉及的像素就是裁剪矩形内的像素,换句话说,裁剪矩形外的像素不被绘制(例如,有的游戏中只需要绘制屏幕的一部分)
Public void setClip(int x,int y,int width,int height)
Public int getClipX()
Public int getClipY()
Public int getClipWidth()
Public int getClipHeight()
Public void clipRect(int x,int y,int width,int height)
4.不变图像和可变图像
创建常规的不变图像:
1. createImage(String name)
2. createImage(InputStream stream)
3. createImage(byte[] imageDtat,int imageOffset,int imageLength)
4. createImager(Image source)
5. createImage(Image image,int x,int y,int width,int height,int transform)
从源图像中选取一个区域进行翻转,生成一个新的不变图像,MIDP2.0新方法
6. createRGBImage(int[] rgb,int width,int height,boolean processAlpha)
从一系列RGBA数据中创建一个不变图像,MIDP2.0新方法
使用以下方法能够截取图像的任何部分绘制到屏幕上,并且该方法允许对源图像进行翻转和镜像处理
Void drawRegion(Image src,int x_src,int y_src,int width,int height,int transform,int x_dest,int y_dest,int anchor);