Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LayeredLayout容器作为背景,在Codenameone中单击时变为白色_Java_Android_Codenameone - Fatal编程技术网

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

Java LayeredLayout容器作为背景,在Codenameone中单击时变为白色,java,android,codenameone,Java,Android,Codenameone,请你帮忙。我有一个非常简单的例子,下面的一页,我想有一个2色的背景,对角线分裂,我已经实现了。由于这是一个分层布局,然后我将覆盖我的页面内容到它 在模拟器中一切都很好,但当我将应用程序放在android设备上时,当我按下屏幕的任何部分时,左上角的三角形变为白色,然后在我取消按下时变回白色。右下角三角形保持正确状态 因为这是主页的背景,所以我显然不希望发生这种颜色变化。 非常感谢 下面是一个示例项目类: package com.test; import com.codename1.u

请你帮忙。我有一个非常简单的例子,下面的一页,我想有一个2色的背景,对角线分裂,我已经实现了。由于这是一个分层布局,然后我将覆盖我的页面内容到它

在模拟器中一切都很好,但当我将应用程序放在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)


请注意,
setbgttransparency(255)
在这一点上可以正常工作,并且是正确的选择,因为您不会有额外的物品在您身后。

谢谢@Shai Almog。我现在已经修改了容器以使用Painter类,它解决了这个问题。新代码如下:

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 = 0x4822A4;
int bottomColour = 0x20AEEA;

private Container getBackground() {
    Container cmp = new Container();
    Painter p = new Painter() {
        @Override
        public void paint(Graphics g, Rectangle rect) {
            boolean antiAliased = g.isAntiAliased();
            g.setAntiAliased(true);

            g.setColor(topColour);

            int[] int_x = new int[] { 0, currentForm.getWidth(), 0 };
            int[] int_y = new int[] { 0, 0, currentForm.getHeight() };

            g.fillPolygon(int_x, int_y, 3);

            g.setColor(bottomColour);
            int[] int_x2 = new int[] { currentForm.getWidth(), currentForm.getWidth(), 0 };
            int[] int_y2 = new int[] { 0, currentForm.getHeight(), currentForm.getHeight() };

            g.fillPolygon(int_x2, int_y2, 3);
            g.setAntiAliased(antiAliased);
        }
    };
    cmp.getAllStyles().setBgPainter(p);
    return cmp;
}