Я работаю с приложением цифровой книги.Я использую SWF-загрузчик для загрузки SWF-страниц, созданных из PDF.Я использую TextSnapsot для рисования текста на страницах.Выделение полностью сохраняется на соответствующих страницах в течение всего сеанса, а затем может быть обновлено / удалено без каких-либо проблем.Все работало замечательно, пока я не внес следующие изменения в подход загрузки SWF, чтобы включить кэширование страниц:
Сейчас я загружаю объект загрузчика SWF в память приложения и, выполняя переход с одной страницы на другую, я просто копируюсодержимое следующей страницы текущего загрузчика SWF, которое отображается на дисплее для пользователя.Существует два набора загрузчиков swf - один для отображения страницы, а другой для кэширования следующей / предыдущей страницы.Что касается кэширования, я загружаю SWF-файл в память приложения и после загрузки загружаю все содержимое загруженной SWF-страницы (потомков ее фрагмента ролика) в коллекцию массивов.При изменении страницы я копирую кэшированное содержимое в видеоклип загрузчика swf, который отображает страницу.
Теперь, когда я выделяю отображаемую страницу и перемещаюсь назад / вперед со страницы и снова возвращаюсь на страницугде я сделал выделение: оно показывает выделение, которое я сделал.Но как только я пытаюсь нарисовать на странице другую подсветку, предыдущая подсветка мгновенно исчезает со страницы.
Я подозреваю, что объект Textsnapshot, который рисует подсветку во время навигации (к целевой странице отображения), отличаетсяот той, которая перерисовывает / обновляет подсветку на той же странице в следующий раз.Хотя идентификатор объекта Textsnapshot для обоих объектов одинаков.
Ниже приведен фрагмент кода:
Для копирования содержимого из объекта загрузчика 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;
}
после этого я отправляю завершенный загрузчик 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