在iOS上,中等大小的蒙版会导致URLImage.createMaskAdapter() / Image.createMask() 失败
我在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。