dialog.dispose() 导致 Android 屏幕闪烁

dialog.dispose() causes screen flickering on Android

我遇到 Android dialog.dispose() 后屏幕闪烁的问题(iOS 不会发生)

这是视频(请以 480p 观看,因为 YouTube 在较低分辨率下会掉帧) https://www.youtube.com/watch?v=YExvPno3hjc

这是对话框的代码

Dialog dialog = new Dialog("Shop");
TableLayout dialogLayout = new TableLayout(buttons.length, 4);

dialog.setName("ShopDialog");
dialog.setLayout(dialogLayout);
dialog.setDisposeWhenPointerOutOfBounds(true);

然后 TableLayout 被标签和按钮填充,包括 "Close" 按钮

Button.setCapsTextDefault(false);
Button closeButton = new Button ("Close");
closeButton.getAllStyles().setFgColor(WordsSynonyms.UI_TEXT_COLOR);
closeButton.getAllStyles().setBgImage(theme.getImage("button.png"));
closeButton.addActionListener(new ActionListener<ActionEvent>() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        dialog.dispose();               
    }
});         
Button.setCapsTextDefault(true);

最后变成这样

dialog.showPacked(BorderLayout.CENTER, true);

问题是,如果我点击 "Close" 按钮整个屏幕闪烁, 它看起来像是覆盖 Form 的黑色矩形的非常简短的外观, 但如果你点击对话框外就不会发生,它会正常消失

我尝试将 Form tint 更改为白色 setTintColor(0x3fffffff),以检查它是否与色调有某种关系,但看起来没有,尽管 Form tint 设置为25% 白色

这发生在三个不同的表单上,有不同的对话框,所以这应该是更通用的东西,以前不是那样,但我在全局级别唯一改变的是 [=40= 的构建提示],这不应该对 Android

产生影响

有什么想法吗?

这可能是后台表单的性能问题或 EDT 违规。在 Android 中,我们异步绘制屏幕,​​如果我们错过一帧,就会发生这种情况。您可以通过使用主题常量删除对话转换来缓解此问题:

dialogTransitionIn=empty
dialogTransitionOut=empty

但也有可能是窗体的某个元素绘制时间过长造成的。在模拟器中打开表格并将其填写到显示问题的级别(无需打开对话框)。然后在性能监视器工具中刷新树并检查绘制窗体所需的绘制操作。看看有没有特别贵的。