Вопрос

Я работаю с цифровой книжной приложением. Я использую SWF-загрузчик для загрузки страниц SWF, созданных из PDF. Я использую Textsnapsot, чтобы нарисовать встроенный текст выделения на страницах. Основной сигнал тщательно сохраняется на соответствующих страницах на протяжении всей сессии, а затем его можно обновить / удалить без проблем. Все отлично работало, пока не сделал следующие изменения в подходе загрузки SWF для включения кэширования страницы:

Теперь я загружаю объект SWF Loader в память приложения и при этом переход с одной страницы на другую страницу, я просто копирую содержимое следующей страницы в текущий загрузчик SWF, который находится на дисплее пользователю. Существует два набора погрузчиков SWF - один для отображения страницы и другие, чтобы кэшировать следующую / предыдущую страницу. На стороне кэширования я загружаю SWF в память приложения, и после того, как нагружается, я выбираю все содержимое загруженной страницы SWF (дети его клима) в коллекцию массива. Изменяя страницу, я копирую кэшированный контент в фильмский клип SWF погрузчика, который отображает страницу.

Теперь, когда я выделяю на странице на дисплее и перейдите назад назад от страницы и возвращаюсь к странице, где я сделал выделение: он показывает, что я сделал. Но, как только я стараюсь нарисовать другую подсветку на этой странице, предыдущий выделение мгновенно исчезает со страницы.

Я подозреваю, что объект textsnapshot, который рисует выделение во время навигации (на страницу целевой дисплеи) отличается от того, что RedRaws / обновляет выделение на той же странице в следующий раз. Хотя идентификатор объекта TexSnapshot для обоих объектов, одинаково.

Вот какой-то фрагмент кода:

Для копирования содержимого от объекта 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 вручную и в обработчике этого события, я беру текст защелкивающийся объект выстрела. (Heightlightmanager.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();

            }                

        }            

    }
.

код, который я использую для RedRaw ранее нарисованным выделением, когда я возвращаюсь на страницу:

    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

Это было полезно?

Решение

What you're doing is not 'caching', it's preloading previous/next pages. Also, what you're doing is really bad practice. I'm not even sure why you're casting these things into MovieClips unless the SWFs are that; if they're Flex SWFs, they'll be UIComponents. I would recommend you rethink your approach. I wouldn't even bother copying the children or anything over. Once the browser loads a SWF, it is now part of the browser cache, meaning the next time it's requested, it won't actually download it.

If you want to 'cache' your SWFs for a quicker next/previous page flipping, I would recommend you use something like SWFLoader to just load the other SWFs without actually adding it to the display, then removing it from memory. That will cache the SWFs for you in the browser. Then when the user click previous/next, just change the url of the main swfloader of the currently displayed page and it will load it up really quickly. No downloading since it's already cached, it will just need to instantiate.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top