java - LayeredLayout 容器,作为背景,在 Codenameone 中单击时变为白色
问题描述
请你帮忙。我在下面有一个非常简单的页面示例,我希望有一个 2 色背景,对角线分割,我已经实现了。因为这是在 LayeredLayout 上,所以我会将我的页面内容覆盖到它上面。
在模拟器中一切都很好,但是当我将应用程序放在我的 android 设备上时,当我按下屏幕的任何部分时,左上角的三角形变为白色,然后当我取消按下时又变回来。右下三角形保持原样。
由于这是主页的背景,因此我显然不希望发生这种颜色变化。非常感谢
示例项目类在这里:
package com.test;
import com.codename1.ui.Button;
import com.codename1.ui.Component;
import com.codename1.ui.Container;
import com.codename1.ui.Form;
import com.codename1.ui.Graphics;
import com.codename1.ui.geom.Dimension;
import com.codename1.ui.layouts.BorderLayout;
import com.codename1.ui.layouts.BoxLayout;
import com.codename1.ui.layouts.LayeredLayout;
public class AndroidKeyboard {
private Form currentForm = new Form("", new BorderLayout());
public void buildPage() {
Container background = getBackground();
currentForm.add(BorderLayout.CENTER, background);
Button button = new Button("Click me");
currentForm.add(BorderLayout.SOUTH, button);
currentForm.show();
}
int topColour = 0x4371A4;
int bottomColour = 0x70AEEA;
private Container getBackground() {
Container layeredContainer = new Container(new LayeredLayout());
layeredContainer.setName("BackgroundContainer");
currentForm.getToolbar().getAllStyles().setBgColor(topColour);
currentForm.getToolbar().getAllStyles().setBgTransparency(255);
//
layeredContainer.getAllStyles().setBgColor(topColour);
layeredContainer.getAllStyles().setBgTransparency(255);
TopTriangleComponent t = new TopTriangleComponent();
t.setTopColour(topColour);
layeredContainer.add(t);
BottomTriangleComponent b = new BottomTriangleComponent();
b.setBottomColour(bottomColour);
layeredContainer.add(b);
return layeredContainer;
}
}
class TopTriangleComponent extends Component {
private int topColour;
protected void setTopColour(int colour) {
topColour = colour;
}
@Override
protected Dimension calcPreferredSize() {
return new Dimension(250, 250);
}
@Override
public void paint(Graphics g) {
g.setColor(topColour);
int[] int_x = new int[] { 0, getWidth(), 0 };
int[] int_y = new int[] { 0, 0, getHeight() };
g.fillPolygon(int_x, int_y, 3);
}
}
class BottomTriangleComponent extends Component {
private int bottomColour;
protected void setBottomColour(int colour) {
bottomColour = colour;
}
@Override
protected Dimension calcPreferredSize() {
return new Dimension(250, 250);
}
@Override
public void paint(Graphics g) {
g.setColor(bottomColour);
int[] int_x = new int[] { getWidth(), getWidth(), 0 };
int[] int_y = new int[] { 0, getHeight(), getHeight() };
g.fillPolygon(int_x, int_y, 3);
}
}
解决方案
您正在创建两个不透明的容器,但只绘制其中的一部分。然后将它们一个放在另一个上,并依赖于您只绘制了一些容器的事实。这适用于某些形式的绘画(从下到上),但是当您单击一个区域时,我们只绘制更改。在这一点上,我们检查不透明度,以防止重新绘制“一切”的成本。
具体来说,这一行是问题所在:
currentForm.getToolbar().getAllStyles().setBgTransparency(255);
它应该是0
表明所需的透明度。但我会完全避免这种分层的方法,因为如果你画的话,它真的很贵。还不如画出一切。在这种情况下,您不需要容器只是 a Painter
,您可以使用样式将其应用于任意组件的背景:setBgPainter(Painter)
。
请注意,setBgTransparency(255)
此时它可以正常工作,并且是正确的选择,因为您身后不会有其他物品。
推荐阅读
- python - 在机器学习中使用 numpy.newaxis
- java - Comparator .comparing().reversed() 奇怪的行为/没有按预期工作
- concurrency - Spring JPA @QueryHint 因锁定超时而被忽略?
- c# - 在 npgsql 准备命令中替换准备好的查询参数的问题
- c# - 需要帮助编辑代码以在键盘而不是滚轮上旋转
- javascript - 如何在 three.js 中修复 FirstPersonControls 给出错误 targetPosition.setFromSphericalCoords is not a function
- python - 如果在函数定义中给出默认服务器名称,pyodbc 会自动连接到数据库吗?
- python - 使用另一个模块中的方法跳出循环
- javascript - 创建参数类型的变量
- git - git push:对象为12311134字节,大于本仓库对象的1048576字节限制