【问题标题】:Scroll inside an item renderer result in an empty item在项目渲染器内滚动会导致一个空项目
【发布时间】:2012-05-03 09:53:24
【问题描述】:

我正在开发一个移动应用程序。我有一个带有水平列表的视图,每个项目都有一个很长的描述,所以我需要一个垂直滚动来获取这些独立信息。我正在尝试将滚动添加为 itemRenderer 的子项。我不明白。有谁知道我在做什么坏事? 我有一个继承 ItemRenderer 的类(我也尝试过 AsFusion 的 BaseRenderer,它似乎对移动应用程序具有更高的性能,结果相同)。 这是我的代码中滚动的部分:

    override protected function createChildren():void
    {
        super.createChildren();
        scroller = new VScrollBar();
        scroller.percentHeight = 100;
        scroller.setStyle('right', 0);
        scrollGroup = new Group();
        scrollGroup.percentHeight = 100;
        scrollGroup.percentWidth = 100;
        super.addElement(scroller);
        super.addElement(scrollGroup);

        scroller.viewport = scrollGroup;
    }

我也试过了

    override protected function createChildren():void
    {
        super.createChildren();
        scroller = new Scroller();
        scroller.percentHeight = 100;
        scroller.percentWidth = 100;
        scrollGroup = new Group();
        scrollGroup.percentHeight = 100;
        scrollGroup.percentWidth = 100;
        super.addElement(scroller);
        super.addElement(scrollGroup);

        scroller.viewport = scrollGroup;
    }

结果是一样的。列表中的一个空项。我可以更改页面(列表水平滚动的pagesnapping)并且下一项也是空的。如果我删除 addElement(scroller) 我可以完美地看到这些项目,但没有我真正需要的垂直滚动。所以问题出在滚动条上。知道我在做什么这么糟糕吗?请?我需要actionscript中的解决方案,我已经完成了更多的itemrenderers,我将进行继承,并且在actionscript中移动设备的性能更好。提前谢谢你。

【问题讨论】:

    标签: apache-flex mobile scroll itemrenderer


    【解决方案1】:

    我从未在项目渲染器中使用过滚动条...但是您可能会查看Scroller 组件?像这样的:

    <s:ItemRenderer>
        <s:Scroller width="100%" height="100%">
            <s:Group>
                <Your_components_here />
            </s:Group>
        </s:Scroller>
    </s:ItemRenderer>
    

    不确定它的行为是否会有所不同。

    【讨论】:

    • 感谢您的回答,但我需要 actionscript 中的解决方案。 (推荐用于移动应用程序中的大型项目渲染器)我将编辑我的问题。我认为我在上面所做的与您在 mxml 中所做的相同。但它不起作用>
    • 您可以在 Actionscript 中实例化一个 Scroller ...只需创建一个并向其添加一个 Group,如上所示...
    • 滚动器使用 VSCrollBar 和 HScrollBar,因此它可能正在执行您上面的代码可能不会执行的操作。
    • 我已经尝试在 actionscript 中将组添加到滚动条,但没有办法,它没有让我。正确的方法是将组分配给滚动条的视口。好的,我将在 actionscript 中搜索有关 VScrollBar 的内容。我会告诉你结果。
    • 有趣,直到现在我才尝试过。我简要查看了 Scroller 的代码 - addElement 说不要使用添加子项,而是使用 viewport,因为您已经在使用 VScrollBar。我在 Scroller.as(第 1100 行)中注意到的一件事是他们这样做:viewport.clipAndEnableScrolling = true; 我认为您只需要调整代码即可到达那里...也许看看 Scroller.as :)
    【解决方案2】:

    为了工作,卷轴需要一个实际的宽度和高度。似乎您要传递的组实际上是空的,尽管它们确实有一组 percentWidth。向其中添加内容。

    如果您正在滚动文本,使用TextArea 的内置滚动可能更可行。

    【讨论】:

    • 感谢您的回答,但事实并非如此。正如我在问题中所说,该组有内容,如果我删除 super.addElement(scroller);显示组内容。内容不仅仅是文字。它有位图图像,一个形状,几个 stylabletext.. 所以这个组不是空的,我可以看到它没有滚动。
    • 尝试在您的组被填充后分配视口并在行上放置一个断点 - 确保该组实际上具有正确的 contentHeightcontentWidth;我还建议使用addElement() 而不是super.addElement()(这有点神秘)
    • 哈哈哈昨天我把它放下了,是不是因为我想为将继承这个的类重写该方法,itemrenderers with scroll。
    • 填充意味着在 addElement(scrollGroup); 之后分配视口?好的,我做到了,我已经调试过了,我知道为什么该组没有显示。该组不是空的,是不可见的。公共变量 visible 被赋值为 true,但私有变量 _visible 被赋值为 false。但我不知道为什么该组在内部是不可见的。 contentHeight/Width 等于 0。为什么? >
    • 我终于拿到内容了!它就像重写方法 updateDisplayList 一样简单,我在里面写了 scroller.width = unscaledWidth; scroller.height = unscaledHeight;现在显示组内容。问题在于滚动条的大小。但不幸的是,它没有完成。滚动条有水平滚动,然后列表中的水平滚动不起作用。我想在 itemrenderer 中进行垂直滚动,如果列表的水平滚动不起作用,这个解决方案是不够的。
    【解决方案3】:

    我解决了,在 Grigorash Vasilij 的指导下,我注意到滚动条的内容没有显示,因为在组中内容大小为 0,私有可见变量为 false。所以滚动条的百分比大小不起作用,我在方法 updateDisplayList 中对其进行了更新。

        override protected function updateDisplayList( unscaledWidth:Number, unscaledHeight:Number ):void
        {                       
            super.updateDisplayList( unscaledWidth, unscaledHeight );
    
            scroller.width = unscaledWidth;
            scroller.height = unscaledHeight;
            ...
        }
    

    之后,滚动条是水平的,然后水平滚动就不起作用了,如果需要的话,我想要一个verticalScroll在item Renderer中,所以在Scroller的构造函数之后我将滚动的horizo​​ntalPolicy设置为off。结果如下:

        override protected function createChildren():void
        {
            super.createChildren();
            scroller = new Scroller();
            scroller.percentHeight = 100;
            scroller.percentWidth = 100;
            scroller.setStyle("horizontalScrollPolicy", "off");
            scrollGroup = new Group();
            scrollGroup.percentHeight = 100;
            scrollGroup.percentWidth = 100;
            addChild(scrollGroup);
            scroller.viewport = scrollGroup;
            addChild(scroller);
    
        }
    

    我的类继承 BaseRenderer from Asfusion 如果你继承 itemrenderer 使用 addElement 而不是 addChild。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 2019-03-11
      • 2021-02-26
      • 2018-06-07
      • 2020-09-17
      相关资源
      最近更新 更多