1

OK、IconItemRenderer を含む List があります。AS3 でデータプロバイダーを設定してスクロールを開始すると、リストが 1 回ちらつきます (1 フレームで白くなります)。これは、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" />

これでちらつきの問題は修正されましたが、リストが横にスクロールする可能性もあり、これも望ましくありませんでした。これは、をに設定することで修正しましhorizontalScrollPolicyoff。これが最終結果です。

<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がAdobeから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 をいずれかの方向にドラッグしたときに 1 回だけ発生します。タッチでは発生しません。私の場合は、Label/IconItemREnderer も使用しません。むしろ、このかなり降下したウォークスルーに基づいてカスタム ItemRenderer を作成しました。 私の measure() メソッドは setElementSize() をまったく使用しません。virtualLayout=false の場合、この問題は発生しません。これは、データ プロバイダーの大きな (>200) 要素のモバイルでは受け入れられません。申し訳ありませんが、まだ回避策はありません。

于 2012-06-13T05:12:54.477 に答える