Codename One应用竖屏模拟器图像缩小问题及分辨率设置求助
问题:Codename One应用竖屏模拟器中图像缩小,桌面端显示正常
我使用Codename One开发了一款仅通过paint方法绘制对象的应用,遇到的问题是:该应用在桌面端运行时图像显示正常,但在竖屏模拟器中运行时图像会缩小。
桌面端显示效果:
竖屏模拟器显示效果:
相关代码
Main类:
public class Main extends Lifecycle { public static GameCanvas gameCanvas; @Override public void runApp() { gameCanvas = new GameCanvas(); gameCanvas.start(); gameCanvas.show(); } }
GameCanvas类:
public final class GameCanvas extends Form{ @Override public void paint(Graphics var1) { try { var1.drawImage(imgLogo, this.getWidth() >> 1,this.getHeight() >> 1); } catch (Exception var3) { } } }
解决方案
这个问题的核心是未考虑Codename One的屏幕缩放系数,以及绘制逻辑未适配图像尺寸与屏幕缩放。
1. 关键原因
Codename One会根据设备/模拟器的屏幕DPI自动应用缩放系数,桌面端和竖屏模拟器的缩放系数不同,直接使用屏幕宽高计算位置且未对图像尺寸做缩放处理,就会导致图像显示比例异常。
2. 修正后的代码
修改GameCanvas类的paint方法,适配缩放系数并确保居中绘制:
@Override public void paint(Graphics g) { super.paint(g); // 必须调用父类方法,保证Form基础渲染正常 try { if (imgLogo != null) { Display display = Display.getInstance(); float scale = display.getDisplayScale(); // 计算图像居中的坐标(考虑缩放后的图像尺寸) int imgWidth = (int) (imgLogo.getWidth() * scale); int imgHeight = (int) (imgLogo.getHeight() * scale); int x = (getWidth() - imgWidth) / 2; int y = (getHeight() - imgHeight) / 2; // 按缩放后的尺寸绘制图像 g.drawImage(imgLogo, x, y, imgWidth, imgHeight); } } catch (Exception e) { e.printStackTrace(); // 保留异常打印,便于调试 } }
3. 额外优化建议
- 资源适配:为不同DPI设备准备多尺寸图像资源,放置在
src/main/resources下的hd/、xdpi/等目录,Codename One会自动匹配最优资源。 - 避免吞异常:原代码的空catch块会掩盖绘制中的错误,建议保留异常输出方便排查问题。
内容的提问来源于stack exchange,提问作者Duy Khong Phai
相关产品推荐
相关产品推荐

