代码之家  ›  专栏  ›  技术社区  ›  AtariPete

黑莓-更新屏幕更改其字段元素的绘图顺序

  •  0
  • AtariPete  · 技术社区  · 16 年前


    在一个屏幕中,我有两个管理器:1)菜单管理器在顶部,2)主体管理器有信息/按钮元素。菜单管理器执行自定义绘图,以便其菜单元素(LabelFields)的间距适当。

    核心问题-经理和子领域绘图顺序

    主体管理器添加或删除字段时, 菜单管理器不是先绘制它自己,然后再绘制它的子元素(标签字段),而是先绘制它的子元素,然后再绘制它自己 ; 因此,在标签字段的顶部进行绘制,使它们看起来像消失了一样。

    评论

    删除自定义子布局是可行的——解决此问题的唯一方法是删除菜单管理器自定义子布局逻辑。不幸的是,菜单系统然后以传统的方式绘制,并没有提供足够的间距。

    public void sublayout(int iWidth, int iHeight)
    {
        final int iNumFields = getFieldCount();
        int maxHeight = 0;
    
    
        final int segmentWidth = iWidth / iNumFields;
        final int segmentWidthHalf = segmentWidth / 2;
    
        for (int i = 0; i < iNumFields; i++)
        {
            final Item currentField = (Item)this.getField(i);
    
            // 1. Use index to compute bounds of the field
            final int xSegmentTrueCenter = segmentWidth * i + segmentWidthHalf;
    
            // 2. center field inbetween bounds using field width (find fill width of text)
            final int xFieldStart = xSegmentTrueCenter - currentField.getFont().getAdvance(currentField.getText())/2;
    
            // set up position
            setPositionChild(currentField, xFieldStart, getContentTop() + MenuAbstract.PADDING_VERTICAL);
    
            // allow child to draw itself
            layoutChild(currentField, iWidth, currentField.getHeight());
    
    
            // compute max height of the field
            //int fieldheight = currentField.getHeight();
            maxHeight = currentField.getHeight() > maxHeight
                ? currentField.getHeight() + 2 * MenuAbstract.PADDING_VERTICAL
                : maxHeight;
        }
        this.setExtent(iWidth, maxHeight);
    }
    

    最后的问题

    1. 在屏幕上添加/删除字段元素时,菜单管理器为什么会以错误的顺序开始绘图?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Anthony Rizk    16 年前

    我没有看到你描述的行为,但下面这句话有点麻烦:

    // allow child to draw itself
    layoutChild(currentField, iWidth, currentField.getHeight());
    

    在通过layoutChild方法调用字段setExtent之前,getHeight()不应返回合理的值。尽管我希望它在所有情况下都会引起问题,但我不知道为什么这会在第一次起作用。在您的逻辑中,我认为您可以安全地使用iHeight而不是currentField.getHeight()。该字段只会使它自己大,因为它需要-它不会使用所有iHeight,除非它像一个垂直字段管理器的东西