手机软件图形界面之低级覆盖
在高级API编程时,你不能控制显示在屏幕上的内容,甚至用编程方式几乎无法控制这些组件。由系统实现体负责选取设备的最佳显示方式。然而,一些如游戏类的应用程序可能需要对屏幕绘制有更多的控制。MIDP dui包也提供了处理这类编程的低级API。
为了在屏幕直接绘制直线,文本和形状,你必须使用Canvas类。该类提供了一个MIDlet可以在其上绘制的空白屏幕。例如,在屏幕上绘制字符串\"HelloWorld\"。实现这个功能有一个简单的办法:子类化Canvas类(它是继承自Displayable的一个抽象类)并重载paint()方法。详见代码段1。
paint()方法的实现使用了aphics类的绘图功能。在方法paint()中,绘图颜色置为红色,然后用红色画一个长方形。其中,方法getWidth( )和getHeight( )分别返回Canvas对象的宽度和高度。接下来setColor( )方法把绘图颜色设置为白色;之后,字符串\"Hello World!\"绘制在屏幕的左上角。
示例1:子类化Canvas
import dui.*;
public class MyCanvas extends Canvas {
public void paint(Graphics g) {
tColor(255, 0, 0);
llRect(0, 0, getWidth(), getHeight( ));
tColor(255, 255, 255);
awString(\"Hello World!\", 0, 0, P | FT);
}
}
现在,为了观看MyCanvas,必须要把实例化后进行显示。既然Canvas是Displayable的一个子类,可以用与其它screen 类使用的同样的setCurrent( )方法来显示它。详见代码段2。
示例2:实例化和显示MyCanvas
import dlet.*;
import dui.*;
public class MyMidlet extends MIDlet {
public MyMidlet( ) {}
public void startApp( ) {
Canvas canvas = new MyCanvas( );
Display display = tDisplay(this);
tCurrent(canvas);
}
public void pauseApp( ) {}
public void destroyApp(boolean unconditional) {}
}
如果你在无线开发包提供的模拟器中运行,可能得到如图1所示的效果。注意在代码段中,颜色被设置为红色与白色,但是既然使用了灰度级屏幕,这里的彩色就被映射到黑色和白色的不同的灰度级上。试着调整显示来观察哪一种设备的色彩显示更好些。
图1.在Canvas上绘制\"Hello World!\"
只要地价涨一倍转手卖出 1. 绘图
坐标(0,0)代表了显示屏的左上角。X坐标的值是从左向右递增的,Y坐标的值是从顶向下递增的。应用程序应该一直检查绘图区的大小,这可以通过如下的类Canvas提供的方法实现:
public int getHeight( );
public int getWidth( );
这两个方法分别以像素值返回可显示区的高度和宽度。
所用的绘图模型是像素替换法--用在graphics对象中指定的当前像素值来代替目标像素值。一个24位的色彩模型由红,绿,蓝各8位(RGB)来提供。然而,由于并非所有的设备都支持彩色,应用程序中要求的颜色将被映射到设备中可用的颜色值上。但是,一个良好的应用程序,应该检查一个设备是否支持彩色-这可以用Display类的方法isColor()和numColors( )来完成。
Graphics类提供了方法setColor()和getColor( )来设置和取得颜色。但是,不象AWT/Swing,不存在方法setBackground( )和setForeground(),所以你必须显式地调用fillRect( )(见示例)。Graphics类的大多数的另外一些方法是自解释的,与该类的AWT版本中的方法差不多。但是,我们还是要仔细地看一下其中的几个在环境J2ME下是如何工作的。
2. 双缓冲
双缓冲机制经常用来实现动画的平滑显示效果。在这种技术中,你不是在显示屏上绘图,而是绘制到显示屏的一个拷贝上(一个脱屏的缓冲区)-它是内存的一部分。当缓冲区绘制结束,你就可以把缓冲区内容拷贝到显示屏上。这里的基本原理是,直接拷贝内存内容到显示屏上要快于用原型绘制的速度。
要实现双缓冲,可以先生成一个其尺寸与屏幕一样的易变图像:
int width = getWidth( );
int height = getHeight( );
Image buffer = eateImage(width, height);
然后,取得缓冲区的图形上下文:
Graphics gc = tGraphics( );
现在,你可以在缓冲区中绘图了:
// animate
// ..
awRect(20, 20, 25, 30);
当需要把缓冲区拷贝到屏幕上时,你可以重载方法paint( )来把缓冲区内容绘制到设备显示屏上:
public void paint(Graphics g) {
awImage(buffer, 0, 0, 0);
}
注意,一些MIDP实现中已经采用了双缓冲机制,因此这里的工作可能是不必要的。你可以使用Canvas的isDoubleBuffered( )方法来检查是否图形是双缓冲方式实现的。
自贡白癜风最好医院乌鲁木齐阳痿治疗多少钱
类风湿关节炎形成原因
- 上一页:手机软件图形界面之计划
- 下一页:执行外部命令并把结果回显到控制台牛
-
小天给您拜年啦!祝大家在属于自己一年红红火火!开开心心!健健康康!心想事成!春联新年祝福 红色喜庆
小天给您拜年啦!祝大家在新的一年红红火火!开开心心!健健康康!心想事...
2024-02-12
-
“北鼎规格”打破台式烤箱刻板印象
由于烹饪常常代代相传,长久以来“爆米花”对于里面面国人的房间只是锦上...
2024-01-15
-
谢娜终于翻车!闷声干大事却被吐槽,新书封面照身着白裙变得好优雅
钟汉良最近的出头大盛,在浪姐的舞台上成功复单单,让大家也看着了她的另...
2024-01-08
-
中远海控(601919.SH)发预盈 广深铁路保持高位 预计上半年净利润约647.16亿元 同比增约
中远海控(601919.SH)披露2022年半年度业绩预增通告,该该公司预定月底实现归属...
2023-11-20
-
【随州相亲交友404期】女生推荐丨开朗可爱的92年美食小编:饭要和投缘的人吃,日子要和那时候你的人过
欢迎光临【宜城追求者】——一个帮助宜城本地已婚男女脱单的应用软件,每...
2023-11-18
-
把女朋友当女儿养的男生也比较聪明 女孩子本来就是你越宠爱 她越可爱的 你给她足够的安全感和保护 她也
把女朋友当女儿饲的男生也非常聪明 女孩子本来就是你越好宠爱 她越好可爱...
2023-11-13