私はデジタルブックアプリケーションを使用しています。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