Java me getHeight()的奇怪行为
我正在创建一个J2ME游戏,我注意到getHeight()函数的奇怪行为 它并没有给出以像素为单位的全屏高度,而是返回的值似乎小于这个值 我的代码: Gamecanvas.java:Java me getHeight()的奇怪行为,java-me,midlet,java-canvas,Java Me,Midlet,Java Canvas,我正在创建一个J2ME游戏,我注意到getHeight()函数的奇怪行为 它并没有给出以像素为单位的全屏高度,而是返回的值似乎小于这个值 我的代码: Gamecanvas.java: package game1; import java.io.IOException; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.game.GameCanvas; public class Gamecanva
package game1;
import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
public class Gamecanvas extends GameCanvas implements Runnable{
private int W=getWidth(),H=getHeight();
public Gamecanvas(){
super(false);
}
//First called by the Midlet
public void start(){
setFullScreenMode(true);
Thread thread=new Thread(this);
thread.start();
}
public void run() {
System.out.println("Running Thread!");
Graphics(getGraphics());
}
private void Graphics(Graphics g) {
Colours(g);
}
private void Colours(Graphics g) {
int w=getWidth(),h=getHeight();
System.out.println("Correct height="+h);
System.out.println("Wrong Height="+H);
g.setColor(0xFFFF00);
g.fillRect(0, 0, w, h);
//If i write g.fillRect(0,0,W,H); the screen is not fully filled
flushGraphics();
}
}
放置int h=getHeight()时;在方法内部,它返回309,这是正确的,并且
放置int H=getHeight()时;在外部方法中,它返回291,这是错误的
getWidth没有问题。w和w都返回240
那么,是什么导致了getHeight()的这种异常行为呢?在调用构造函数之前调用
getHeight()
(或任何函数)通常是个坏主意。
只有当构造函数被调用时,对象才会被实例化
在调用构造函数之前调用getHeight()
,从而得到值291,我猜这是非全屏模式下的可用高度。
然后调用构造函数,在该构造函数中设置fullscreenmode(true),然后值变为309
还有一些需要注意的事情:实际上,在构造函数中调用setFullScreenMode(true)
也是个坏主意(至少有些人认为是这样),因为对象还没有创建。最佳做法是在run()
方法中调用它。如果您在构造函数内部调用它,它仍将在某些设备上运行,但某些设备可能会对此抱怨。
这似乎只适用于JavaME,因为当你看Android开发时,你会发现很多情况下你实际上被迫以完全相反的方式编写代码。。。也就是说,在构造函数中对对象调用函数。算了吧
无论如何,要记住的另一件事是getHeight()
将返回可用像素的数量。仅仅因为手机的分辨率为240x320像素,并不意味着你就可以使用320像素。有些设备“窃取”了一些我们并不真正想要的像素,但我们对此无能为力
编辑:
关于“不要在其构造函数内的对象上调用函数”:早在j2meforums.org存在时,它就被讨论了很多。许多开发人员在让setFullScreenMode(true)工作时遇到问题,因为他们在构造函数内部调用了它。当你考虑它的时候,它是有意义的。您不能对尚不存在的对象调用函数,而且在调用构造函数之前该对象也不存在。
(这就是为什么一些J2ME开发人员对Android开发感到困惑的原因,因为在Android开发中,您实际上被迫在自己的构造函数中调用各种对象上的函数。来自J2ME,这种方式需要一点习惯)