在iOS上,中等大小的蒙版会导致URLImage.createMaskAdapter() / Image.createMask() 失败

移动开发 2026-07-09

我在iOS上发现Codename One似乎最近出现了一个回归。

问题出现在使用 URLImage.createMaskAdapter() 创建掩码适配器时。相同的代码在Codename One模拟器和Android设备上工作正常。几天前在iOS上也曾能工作。

起初我以为这可能与最近的UIScene变更有关,但经过排查范围缩小后,我不认为UIScene参与其中。

这段代码在iOS上工作正常:

Image roundMask = Image.createImage(100, 100, 0xff000000);
Graphics g = roundMask.getGraphics();
g.setColor(0xffffff);
g.fillRoundRect(0, 0, 100, 100, 60, 60);

URLImage.ImageAdapter ada = URLImage.createMaskAdapter(roundMask);

这段代码也在iOS上工作:

Image roundMask = Image.createImage(100, 150, 0xff000000);
Graphics g = roundMask.getGraphics();
g.setColor(0xffffff);
g.fillRoundRect(0, 0, 100, 150, 60, 60);

URLImage.ImageAdapter ada = URLImage.createMaskAdapter(roundMask);

然而,这在真实的iOS设备上失败:

Image roundMask = Image.createImage(410, 410, 0xff000000);
Graphics g = roundMask.getGraphics();
g.setColor(0xffffff);
g.fillRoundRect(0, 0, 410, 410, 60, 60);

URLImage.ImageAdapter ada = URLImage.createMaskAdapter(roundMask);

这也失败:

Image roundMask = Image.createImage(410, 614, 0xff000000);
Graphics g = roundMask.getGraphics();
g.setColor(0xffffff);
g.fillRoundRect(0, 0, 410, 614, 60, 60);

URLImage.ImageAdapter ada = URLImage.createMaskAdapter(roundMask);

异常是:

[EDT] 0:0:0,963 - Exception: java.lang.RuntimeException - null
java.lang.RuntimeException
    at com_codename1_ui_Image.createMask:1090
    at com_codename1_ui_URLImage.createMaskAdapter:231

因此问题似乎与iOS上的 Image.createMask() / URLImage.createMaskAdapter() 有关,当掩码尺寸达到中等偏大时。410 x 410 似乎并不特别大,但直到最近在iOS上也能正常工作。

解决方案

这并不像是你的代码问题,而是Codename One在 iOS上的特定限制所致。

为了创建运行时掩码,Codename One使用本地Core Graphics。这个操作在真实的iOS设备上是一个内存密集型任务。

请注意,苹果公司并未提及任何尺寸上限,但从以上数值可以判断你也会看到同样的现象。

在Android和 iOS模拟器上能工作,因为iOS模拟器在渲染时不使用GPU,只有真实的iOS设备才会使用GPU。

因此,较大的运行时掩码在iOS上会失败。

你可以尝试避免这个问题的方法是使用如上所述的小图像掩码,它可以工作,并让Codename One在内部处理缩放。

或者

尝试使用圆角图片API,避免使用掩码,这将防止此崩溃。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章