J2ME低级用户界面

1.重绘和强制重绘

在用J2ME的低级UI时,所有的界面绘制要靠自己来实现,主要是在paint消息中来做,这里涉及几个接口:paintrepaintserviceRepaintscallSerially

paint

paint相当于是个回调函数,被J2ME主线程(处理UI和事件)来调用,任何时候我们都不能自己直接调用paint,程序在paint里面按部就班的画出界面即可,paint会带一个Graphics参数,用这个graphics去作图就可以了。

现在的很多J2ME平台已经默认支持双缓冲,所以在paint执行时,实际上界面并没有画出,而是等到paint执行完成后,一次性刷新到屏幕上的,不过这是和平台相关的。

repaint

这个是通知系统,我们需要刷新界面了,但仅仅是个通知,repaint会立即返回(无阻塞),paint会在合适的时候被系统调用,所以paintrepaint不是一一对应的,有一个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被调用时,偏移量被加到每个XY坐标轴上,当前的原点可以通过getTranslateXgetTranslateY方法得到

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值