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

时间:2018-09-08 13:58:30

标签: java android codenameone

请您帮忙。我在页面下面有一个非常简单的示例,我想要一个2色的背景,对角线分割,这是我已经实现的。由于它位于LayeredLayout上,因此我会将页面内容覆盖在上面。

Screenshot

在模拟器中一切都很好,但是当我将应用程序放到我的android设备上时,然后当我在屏幕的任何部分上按时,左上角的三角形将变为白色,然后在我按下时返回。右下角的三角形保持原样。

因为这是主页的背景,所以我显然不希望这种颜色发生变化。 非常感谢

一个示例项目类在这里:

# respond to switch connection up event
def _handle_ConnectionUp(self, event):
    self.connection = event.connection
    print("connecting to %s" %(self.connection))
    # code to send ARP requests to servers


    r = arp()
    r.hwtype = r.HW_TYPE_ETHERNET
    r.prototype = r.PROTO_TYPE_IP
    r.hwlen = 6
    r.protolen = r.protolen
    r.opcode = r.REQUEST
    r.hwdst = ETHER_BROADCAST
    r.protodst = IPAddr("10.0.0.8")
    r.hwsrc = EthAddr("00:12:34:56:78:90")
    r.protosrc = IPAddr("10.1.2.3")
    e = ethernet(type=ethernet.ARP_TYPE, src=EthAddr("00:12:34:56:78:90") , dst=ETHER_BROADCAST)
    e.set_payload(r)
    msg = of.ofp_packet_out()
    msg.data = e.pack()
    msg.actions.append(of.ofp_action_output(port = of.OFPP_FLOOD))
    event.connection.send(msg)

2 个答案:

答案 0 :(得分:1)

您正在创建两个不透明的容器,但只绘制其中的一部分。然后,将它们一个放在另一个之上,并依靠您只抽出一些容器这一事实。这适用于某些形式的绘制(从下到上),但是当您单击某个区域时,我们仅绘制更改。在这一点上,我们检查不透明度,以防止再次涂抹“所有东西”的成本。

具体来说,这是问题所在:

currentForm.getToolbar().getAllStyles().setBgTransparency(255);

应该为0来指示所需的透明度。但是我会完全避免这种分层方法,因为如果您进行绘图,它确实非常昂贵。最好画所有东西。在这种情况下,您只需要一个Painter容器,就可以使用setBgPainter(Painter)样式将其应用于任何任意组件的背景。

请注意,setBgTransparency(255)那时将可以正常工作,并且是正确的选择,因为您身后没有其他物品。

答案 1 :(得分:0)

感谢@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;
}