为什么我在 Codename One 模拟器中的行为与在真实 Android 设备上的行为不同?
Why do I get a different behviour in Codename One simulator than on a real Android device?
我想弄清楚为什么我在模拟器(iPhone、Nexus、Nexus5、...皮肤)VS Android 真实设备上使用以下代码得到不同的行为(我的目标是在背景图像上绘制文本并将整个图像保存在背景图像分辨率中):
请注意,GUI 是使用 Designer 完成的。
protected void beforeMain(Form f) {
// The drawing label will contain the whole photo montage
f.setLayout(new LayeredLayout());
final Label drawing = new Label();
f.addComponent(drawing);
String nom = "Hello World";
// Image mutable dans laquelle on va dessiner (fond blancpar défaut)
// synthe is an Image
Image mutableImage = Image.createImage(synthe.getWidth(), synthe.getHeight());
drawing.getUnselectedStyle().setBgImage(mutableImage);
drawing.getUnselectedStyle().setBackgroundType(Style.BACKGROUND_IMAGE_SCALED_FIT);
// Draws over the background image and put all together on the mutable image.
paintSyntheOnBackground(mutableImage.getGraphics(),
synthe,
nom,
synthe.getWidth(),
synthe.getHeight());
long time = new Date().getTime();
OutputStream os;
try {
os = Storage.getInstance().createOutputStream("screenshot_" + Long.toString(time) + ".png");
ImageIO.getImageIO().save(mutableImage, os, ImageIO.FORMAT_PNG, 1.0f);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // end of beforeMain
这是我调用的在图像上绘制文本的方法
public void paintSyntheOnBackground(Graphics g,
Image synthe,
final String pNom,
int width, int height) {
Font myFont = g.getFont();
g.setFont(myFont);
int w = myFont.stringWidth(pNom);
int h = myFont.getHeight();
// Added just to see the background
g.setColor(0x0000FF);
g.fillRect(0, 0, width, height);
g.setColor(0xff0000);
int x = g.getTranslateX() + width / 2 - w / 2;
int y = g.getTranslateY() + height / 2 - h / 2;
g.drawRect(x, y, w, h);
g.drawString(pNom, x, y);
} // end of paintSyntheOnBackground
这是模拟器 (GoogleNexus7) 上的结果:
这是设备上的结果 (Android 4.4):
我的开发系统在 Linux 上使用代号为 V3-4 的 Eclipse。
我知道模拟器无法重现具体情况,但这里没有什么特别的,不是吗?我该怎么做才能使模拟器上的行为反映真实行为,因为在模拟器中测试会更方便?
编辑:将我的每个 CN1 项目库从版本 114 升级到 115 后(参见 this question for details on how to do the upgrade),我现在能够在模拟器和设备中获得相同的行为!伟大的错误修复工作 CN1 团队!
请注意:在我的例子中(Eclipse - Linux)我不得不升级 每个 Codename One 项目中的项目库。
如有任何帮助,我们将不胜感激!
干杯,
这是一个非常烦人的错误,我们 just fixed now 所以它可以在今天的版本中出现。
只有在模拟器处于缩放模式的情况下在可变图像上绘制时才会出现问题,这两种情况我们都不经常这样做,因为缩放模式不太准确,可变图像通常较慢。
感谢您关注此消息。
我想弄清楚为什么我在模拟器(iPhone、Nexus、Nexus5、...皮肤)VS Android 真实设备上使用以下代码得到不同的行为(我的目标是在背景图像上绘制文本并将整个图像保存在背景图像分辨率中):
请注意,GUI 是使用 Designer 完成的。
protected void beforeMain(Form f) {
// The drawing label will contain the whole photo montage
f.setLayout(new LayeredLayout());
final Label drawing = new Label();
f.addComponent(drawing);
String nom = "Hello World";
// Image mutable dans laquelle on va dessiner (fond blancpar défaut)
// synthe is an Image
Image mutableImage = Image.createImage(synthe.getWidth(), synthe.getHeight());
drawing.getUnselectedStyle().setBgImage(mutableImage);
drawing.getUnselectedStyle().setBackgroundType(Style.BACKGROUND_IMAGE_SCALED_FIT);
// Draws over the background image and put all together on the mutable image.
paintSyntheOnBackground(mutableImage.getGraphics(),
synthe,
nom,
synthe.getWidth(),
synthe.getHeight());
long time = new Date().getTime();
OutputStream os;
try {
os = Storage.getInstance().createOutputStream("screenshot_" + Long.toString(time) + ".png");
ImageIO.getImageIO().save(mutableImage, os, ImageIO.FORMAT_PNG, 1.0f);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // end of beforeMain
这是我调用的在图像上绘制文本的方法
public void paintSyntheOnBackground(Graphics g,
Image synthe,
final String pNom,
int width, int height) {
Font myFont = g.getFont();
g.setFont(myFont);
int w = myFont.stringWidth(pNom);
int h = myFont.getHeight();
// Added just to see the background
g.setColor(0x0000FF);
g.fillRect(0, 0, width, height);
g.setColor(0xff0000);
int x = g.getTranslateX() + width / 2 - w / 2;
int y = g.getTranslateY() + height / 2 - h / 2;
g.drawRect(x, y, w, h);
g.drawString(pNom, x, y);
} // end of paintSyntheOnBackground
这是模拟器 (GoogleNexus7) 上的结果:
这是设备上的结果 (Android 4.4):
我的开发系统在 Linux 上使用代号为 V3-4 的 Eclipse。
我知道模拟器无法重现具体情况,但这里没有什么特别的,不是吗?我该怎么做才能使模拟器上的行为反映真实行为,因为在模拟器中测试会更方便?
编辑:将我的每个 CN1 项目库从版本 114 升级到 115 后(参见 this question for details on how to do the upgrade),我现在能够在模拟器和设备中获得相同的行为!伟大的错误修复工作 CN1 团队! 请注意:在我的例子中(Eclipse - Linux)我不得不升级 每个 Codename One 项目中的项目库。
如有任何帮助,我们将不胜感激!
干杯,
这是一个非常烦人的错误,我们 just fixed now 所以它可以在今天的版本中出现。
只有在模拟器处于缩放模式的情况下在可变图像上绘制时才会出现问题,这两种情况我们都不经常这样做,因为缩放模式不太准确,可变图像通常较慢。
感谢您关注此消息。