0

私はデジタルブックアプリケーションを使用しています。swfローダーを使用して、pdfから作成されたswfページをロードします。TextSnapsot を使用して、ページにインライン テキスト ハイライトを描画します。ハイライトは、セッション全体を通じてそれぞれのページに完全に保持され、後で問題なく更新/削除できます。ページのキャッシュを有効にするために、swf の読み込み方法に次の変更を加えるまで、すべてがうまく機能していました。

現在、swf ローダー オブジェクトをアプリケーション メモリにロードしています。あるページから別のページにジャンプしているときに、次のページのコンテンツを、ユーザーに表示されている現在の swf ローダーにコピーしています。swf ローダーには 2 つのセットがあります。1 つはページを表示するためのもので、もう 1 つは次/前のページをキャッシュするためのものです。キャッシュ側では、swf をアプリケーション メモリにロードし、ロードした後、ロードした swf ページ (ムービー クリップの子) のすべてのコンテンツを配列コレクションに選択します。ページを変更している間、キャッシュされたコンテンツを、ページを表示している swf ローダーのムービー クリップにコピーします。

表示されているページを強調表示し、ページから前後に移動して、強調表示を行ったページに再び戻ると、行った強調表示が表示されます。しかし、そのページに別のハイライトを描画しようとすると、前のハイライトがすぐにページから消えてしまいます。

(ターゲット表示ページへの) 移動中にハイライトを描画する Textsnapshot オブジェクトは、次回同じページでハイライトを再描画/更新するものとは異なると思われます。両方のオブジェクトの Textsnapshot オブジェクト ID は同じですが。

コード スニペットを次に示します。

アプリケーションメモリにキャッシュされた swf loader オブジェクトからコンテンツをコピーするには:

    private function copyPageContent():void

    {

        var contentCollection:ArrayCollection = new ArrayCollection();

        _pageContentVO = new PageContentVO();

        _pageContentVO.contentHeight = MovieClip(_swfPageLoader.content).height;

        _pageContentVO.contentWidth = MovieClip(_swfPageLoader.content).width;



        var count:int = MovieClip(_swfPageLoader.content).numChildren;                

        for(var i:int=0;i<count;i++)

        {

            var dispObject:DisplayObject = MovieClip(_swfPageLoader.content).removeChildAt(0);                

            contentCollection.addItem(dispObject);

        }



        _pageContentVO.pageContentCollection = contentCollection;

        _swfPageLoader = null;

    }

ページを表示しているswfローダーにコンテンツをコピーするには:

    private function copyContent(pageContentVo:PageContentVO):void

    {

        for(var i:int = 0;i<pageContentVo.pageContentCollection.length;i++)

        {

            var dispObject:DisplayObject = pageContentVo.pageContentCollection.getItemAt(i) as DisplayObject;

            MovieClip(this.content).addChild(dispObject);

        }

        this.content.height = this.height;

        this.content.width = this.width;

    }

この後、swf ローダーの完了を手動でディスパッチし、そのイベントのハンドラーでテキスト スナップ ショット オブジェクトを取得します。(highlightManager.as)

ハイライトを手動で描画するために使用するコード (ページ上でのマウス ドラッグを使用)。

    public function setHighlight():void

    {

        removeAll();

        if(_textSnapShot!=null && _textSnapShot.getText(0,_textSnapShot.charCount)!="")

        {                

            if(_isCoveredTextSelectedAtAnyInstance)

            {

                _textSnapShot.setSelected(_beginIndex,_endIndex+1,false); //this is the global variable to the class

            }

            else

            {

                _textSnapShot.setSelectColor(0xfff100);

                _textSnapShot.setSelected(_beginIndex,_endIndex+1,true);

            }

            if(saveHighlight)

            {

                countHighlightedSegments();

            }                

        }            

    }

ページに戻ったときに、以前に描画したハイライトを再描画するために使用するコード:

    public function showHighlights(textSnapShot:TextSnapshot,currentPageNum:int):void

    {            

        if(currentPageNum >= 0)

        {

            textSnapShot.setSelected(0,textSnapShot.charCount,false);

            var pageVO:PageVO = _model.eBookVO.eBookPagesVO.getItemAt(currentPageNum) as PageVO;

            var objColl:ArrayCollection = new ArrayCollection();

            objColl.source = pageVO.highLightSelection;

            for(var i:int=0;i<objColl.length;i++)

            {

                var highlightVO:HighlightVO = new HighlightVO();

                highlightVO.beginIndex = objColl.getItemAt(i).beginIndex;

                highlightVO.endIndex = objColl.getItemAt(i).endIndex;

                setHighlightedSegment(textSnapShot,highlightVO.beginIndex,highlightVO.endIndex);

            }

        }

    }



    private function setHighlightedSegment(textSnapShot:TextSnapshot,beginIndex:int,endIndex:int):void

    {

        textSnapShot.setSelectColor(0xfff100);

        textSnapShot.setSelected(beginIndex,endIndex,true);

    }

この問題を解決するためのサポートをお待ちしております。

よろしく、

JS

4

1 に答える 1

1

あなたがしているのは「キャッシュ」ではなく、前/次のページをプリロードしています。また、あなたがしていることは本当に悪い習慣です。SWFがそうでない限り、なぜこれらのものをMovieClipにキャストしているのかさえわかりません。Flex SWF の場合は、UIComponents になります。アプローチを再考することをお勧めします。私は子供たちや何かをコピーすることさえ気にしません。ブラウザが SWF をロードすると、それはブラウザ キャッシュの一部になります。つまり、次にリクエストされたときに、実際にはダウンロードされません。

次/前のページをすばやく切り替えるために SWF を「キャッシュ」する場合は、SWFLoader などを使用して、実際に表示に追加せずに他の SWF をロードしてから、メモリから削除することをお勧めします。これにより、ブラウザーで SWF がキャッシュされます。次に、ユーザーが前へ/次へをクリックすると、現在表示されているページのメインの swfloader の URL を変更するだけで、非常に迅速にロードされます。すでにキャッシュされているため、ダウンロードは必要ありません。インスタンス化するだけで済みます。

于 2012-03-01T18:41:57.323 に答える