Проблема выделения текста с объектом TextSnapshot - Flex AS3 - PullRequest
0 голосов
/ 01 марта 2012

Я работаю с приложением цифровой книги.Я использую 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

1 Ответ

1 голос
/ 01 марта 2012

То, что вы делаете, это не «кэширование», это предварительная загрузка предыдущих / следующих страниц. Кроме того, то, что вы делаете, это действительно плохая практика. Я даже не уверен, почему вы добавляете эти вещи в MovieClips, если только SWF не являются таковыми; если это Flex SWFs, они будут UIComponents. Я бы порекомендовал вам пересмотреть свой подход. Я бы даже не стал копировать детей или что-то еще. После того, как браузер загрузит SWF-файл, он станет частью кеша браузера, то есть при следующем запросе он фактически не загрузит его.

Если вы хотите «кэшировать» свои SWF-файлы для более быстрого перелистывания следующей / предыдущей страницы, я бы порекомендовал вам использовать что-то вроде SWFLoader, чтобы просто загрузить другие SWF-файлы без фактического добавления их на дисплей, а затем удалить их из памяти. Это будет кэшировать SWF для вас в браузере. Затем, когда пользователь нажимает предыдущий / следующий, просто измените URL основного загрузчика текущей отображаемой страницы, и он очень быстро загрузится. Нет загрузки, поскольку она уже кэширована, ее нужно будет просто создать.

...