java - LayeredLayout 容器,作为背景,在 Codenameone 中单击时变为白色

标签 java android codenameone

请你帮忙。我在下面有一个非常简单的页面示例,我希望它有一个 2 色背景和对角线分割,我已经实现了。因为这是在 LayeredLayout 上,所以我会将我的页面内容叠加到它上面。

Screenshot

在模拟器中一切正常,但是当我将应用程序放在我的 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 以指示所需的透明度。但我会完全避免这种分层方法,因为如果你无论如何都要画的话,它真的很昂贵。还不如画出一切。在这种情况下,您不需要容器,只需要一个 Painter,您可以使用样式将其应用于任何任意组件的背景:setBgPainter(Painter)

请注意,setBgTransparency(255) 将在此时正常工作并且是正确的选择,因为您不会有其他项目在您身后。

关于java - LayeredLayout 容器,作为背景,在 Codenameone 中单击时变为白色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52236016/

相关文章:

JavaFX :Open Acrobat Pdf Reader Inside JavaFX Frame

android - 如何创建在指定屏幕位置显示的 android Activity ?

codenameone - 如何更改代号一张图表背景颜色

codenameone - 代号一的 Android 推送通知立即被取消

java和mysql登录验证

java - GUI 上的控制台输出

Java实体java.sql.SQLException : Field 'id' doesn't have a default value

android - 当今天设置的时间在 android 中过去时,计算警报的触发时间?

java - 如何将任何对象转换为字符串?

java - Parse Server 如何通过查询获取对象 ID?