私はデジタルブックアプリケーションを使用しています。 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
こんにちは、JAXはすばやく示唆的な応答に感謝します。 最初のアプローチはあなたが最初に提案したものでしたが、私はすでに第2のアプローチを試みました。それはローディングを改善しましたが、私の要求は依然としてより速いローディングを必要とします。私のアプローチでは、私のアプリケーションのすべての機能は、はるかに優れたユーザーエクスペリエンスでシームレスに正常に動作していますが、ハイライト機能です。 この問題に対する他の提案はありますか? –
クロームの開発者コンソール、またはfirefoxのfirebugを使用して、どれくらい時間がかかるかを調べてください。キャッシュされている場合は、ハードディスクにアクセスしてSWFに追加するのに非常に時間がかかります。問題がどこにあるのか(そして私が間違っていると思うところ)、それがロードされた後もまだロードされたswfの初期化が必要であるという事実です。私はそれが最も時間を取っている場所だと思うでしょう。あなたがすべきことは、できるだけ速くロードするようにswfを最適化しようとすることです。 3つのSWFローダーを使用してプレビューを初期化し、次に表示されているものに応じてスワップすることができます。 –
こんにちはJAX、もう一度示唆的な応答のために、 私の問題が解決されたことを教えてください。これはtextSnapShot GCの問題でした。 GCを避けるためにtextsnapshotオブジェクトを配列に追加したところ、問題が解決しました。 私はあなたの提案に来ています - 私はあなたが言っていることを正確に行っています( "3つのSWFローダーを使用して事前に初期化してから、それを見ているものに合わせてスワップすることができます)"、swfsをスワップするのではなく、表示前swfの内容を表示swfの内容に置き換えます。 Swfをスワップするのは私のアプリケーションの構造に対して何かがあったからです。 –