2012-03-01 9 views
0

私はデジタルブックアプリケーションを使用しています。 swf loaderを使ってpdfから作成したswfページを読み込みます。私は、TextSnapsotを使用して、ページ上にインラインテキストハイライトを描画します。ハイライトは、セッション中の各ページに完全に保持され、後で問題なく更新/削除できます。TextSnapshotオブジェクトの強調表示の問題 - Flex AS3

私はswf loaderオブジェクトをアプリケーションメモリにロードしていますが、あるページから他のページへジャンプしている間に、私はちょうどその内容をコピーしています。表示されている現在のswfローダにユーザの次のページを表示します。 swfローダーには2つのセットがあります.1つはページを表示し、もう1つは次/前のページをキャッシュします。キャッシング側では、swfをアプリケーションメモリにロードし、ロードされた後、ロードされたswfページのすべてのコンテンツ(ムービークリップの子)を配列コレクションに取り込みます。ページを変更している間は、キャッシュされたコンテンツをページを表示しているswfローダーのムービークリップにコピーします。

ここで、表示中のページをハイライト表示し、ページから前後にナビゲートし、ハイライトを行ったページに再び戻ってきます。しかし、そのページに別のハイライトを描こうとするとすぐに、前のハイライトがページから瞬時に消えてしまいます。

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

は、いくつかのコードスニペットです:

アプリケーションメモリにキャッシュされたSWFローダーオブジェクトからのコンテンツのコピーについて:ページを表示しているSWFローダーにコンテンツをコピーするための

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; 

    } 

。(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

答えて

1

'キャッシング' ではない、それは前/次ページをプリロードいます。また、あなたがしているのはです。本当に悪い習慣です。 SWFがそうでない限り、なぜあなたがMovieClipsにこれらの要素をキャストしているのかはわかりません。 Flex SWFの場合、UIComponentになります。あなたのアプローチを再考することをお勧めします。私は子供や何かをコピーしても気にしないだろう。ブラウザがSWFを読み込むと、ブラウザキャッシュの一部になり、次回の要求時には実際にダウンロードされません。

SWFをキャッシュして次回または前のページのフリップを早くするには、SWFLoaderのようなものを使用して実際にディスプレイに追加せずにメモリから取り除くだけです。これにより、SWFがブラウザにキャッシュされます。ユーザーが[前へ]/[次へ]をクリックすると、現在表示されているページのメインswfloaderのURLを変更するだけで、本当にすばやく読み込まれます。既にキャッシュされているので、ダウンロードする必要はありません。インスタンス化するだけです。

+0

こんにちは、JAXはすばやく示唆的な応答に感謝します。 最初のアプローチはあなたが最初に提案したものでしたが、私はすでに第2のアプローチを試みました。それはローディングを改善しましたが、私の要求は依然としてより速いローディングを必要とします。私のアプローチでは、私のアプリケーションのすべての機能は、はるかに優れたユーザーエクスペリエンスでシームレスに正常に動作していますが、ハイライト機能です。 この問題に対する他の提案はありますか? –

+0

クロームの開発者コンソール、またはfirefoxのfirebugを使用して、どれくらい時間がかかるかを調べてください。キャッシュされている場合は、ハードディスクにアクセスしてSWFに追加するのに非常に時間がかかります。問題がどこにあるのか(そして私が間違っていると思うところ)、それがロードされた後もまだロードされたswfの初期化が必要であるという事実です。私はそれが最も時間を取っている場所だと思うでしょう。あなたがすべきことは、できるだけ速くロードするようにswfを最適化しようとすることです。 3つのSWFローダーを使用してプレビューを初期化し、次に表示されているものに応じてスワップすることができます。 –

+0

こんにちはJAX、もう一度示唆的な応答のために、 私の問題が解決されたことを教えてください。これはtextSnapShot GCの問題でした。 GCを避けるためにtextsnapshotオブジェクトを配列に追加したところ、問題が解決しました。 私はあなたの提案に来ています - 私はあなたが言っていることを正確に行っています( "3つのSWFローダーを使用して事前に初期化してから、それを見ているものに合わせてスワップすることができます)"、swfsをスワップするのではなく、表示前swfの内容を表示swfの内容に置き換えます。 Swfをスワップするのは私のアプリケーションの構造に対して何かがあったからです。 –