1

好的,我有一个包含 IconItemRenderer 的列表。当我在 AS3 中设置它的 dataprovider 并开始滚动时,列表闪烁一次(一帧变白)。这只发生在设置了 messageField/messageFunction 并且消息区域中有不同数量的行时。我确定这是一个框架错误。有没有人有同样的经历?如果有人知道解决方法,我会很高兴。提前致谢。


这是视图组件的示例代码。奇怪的是,闪烁似乎有时需要更多时间,有时需要更少时间。我在 Android 和桌面模式 (adl) 上对其进行了测试,两者都发生了错误。“blabla..”只是为了得到一个随机行数的字符串。

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView">
    <s:actionContent>
        <s:Button label="Set List" click="btn_click(event)"/>
    </s:actionContent>
    <s:List width="100%" height="100%" id="list">
        <s:itemRenderer>
            <fx:Component>
                <s:IconItemRenderer messageField="text"/>
            </fx:Component>
        </s:itemRenderer>
    </s:List>
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayList;

            protected function btn_click(event:MouseEvent):void
            {
                var al:ArrayList = new ArrayList;
                var obj:Object;
                var str:String = "blablablablablablablablablablablablablablablablablablablablabblablablablablablablablablablablablablablablablablablablablabblablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla";
                for(var i:int = 0; i < 20; i++) {
                    obj = new Object;
                    obj.text = str.substr(0, Math.random()*str.length);
                    al.addItem(obj);
                }
                list.dataProvider = al;
            }

        ]]>
    </fx:Script>
</s:View>

请参阅错误报告:https ://issues.apache.org/jira/browse/FLEX-33383

有关解决方法,请参阅下面的正确答案。

4

3 回答 3

1

我想我可能有一个解决方法给你。该问题似乎与内容对齐有关,因此我尝试通过设置自定义布局contentJustify而不是默认来更改默认对齐justify

<s:VerticalLayout gap="0" 
                  horizontalAlign="contentJustify" 
                  requestedMinRowCount="5" />

这解决了我的闪烁问题,但现在列表也可以横向滚动,这也是不希望的。我通过设置horizontalScrollPolicy来解决这个问题off。这是最终结果:

<s:List width="100%" height="100%" id="list" horizontalScrollPolicy="off">
    <s:itemRenderer>
        <fx:Component>
            <s:IconItemRenderer messageField="text"/>
        </fx:Component>
    </s:itemRenderer>
    <s:layout>
        <s:VerticalLayout gap="0" horizontalAlign="contentJustify" r
                          equestedMinRowCount="5" />
    </s:layout>
</s:List>

您可能希望正式提交此错误,尽管我不完全知道您必须在哪里执行此操作,因为 Flex 正在从 Adob​​e 迁移到 Apache。

于 2012-05-08T10:07:46.723 回答
1

我最终找到了解决方法。基本上它只是在列表调度 updateComplete 事件时伪造一个拖动事件。这可以防止在用户第一次开始滚动时出现闪烁,并且由于在最初显示列表之前调用了 updateComplete,因此根本没有闪烁。积极的副作用是,每次您切换到包含此列表的视图或列表获取另一个数据提供者时,滚动条都会显示片刻,因此您无需触摸即可猜测列表有多大。

所以这里是代码。我将此列表用作我所有列表的超类:

import mx.events.FlexEvent;
import mx.events.TouchInteractionEvent;
import spark.components.List;

public class MyList extends List
{
    public function MyList()
    {
        super();

        //add event listeners
        addEventListener(FlexEvent.UPDATE_COMPLETE, updateCompleteHandler);
    }

    //update complete
    protected function updateCompleteHandler(event:FlexEvent):void
    {
        //fake touch start
        fakeTouchEvent(TouchInteractionEvent.TOUCH_INTERACTION_START);
        callLater(endTouch);
    }

    //quit touch event
    protected function endTouch():void {
        //fake touch end
        fakeTouchEvent(TouchInteractionEvent.TOUCH_INTERACTION_END);
    }

    //fake touch event
    protected function fakeTouchEvent(type:String):void {
        var evt:TouchInteractionEvent = new TouchInteractionEvent(type);
        evt.relatedObject = scroller;
        scroller.dispatchEvent(evt);
    }
}
于 2013-02-05T18:50:28.843 回答
0

我也确实看到了这个问题(Flex 4.6 + AIR 3.1),正如描述的那样:白色闪烁只发生一次,当 List 被拖动到任一方向时。它不会在触摸时发生。在我的情况下,我什至不使用 Label/IconItemRenderer,而是基于这个漂亮的下降通道构建了一个自定义 ItemRenderer。 的 measure() 方法根本不使用 setElementSize()。当 virtualLayout=false 时不会发生此问题,这在移动设备上对于数据提供程序中的大型 (>200) 元素是不可接受的。抱歉,目前还没有解决方法。

于 2012-06-13T05:12:54.477 回答