Pregunta

Estoy trabajando con una aplicación de libro digital. Hago uso de SWF cargador para cargar páginas SWF creadas a partir de PDF. Utilizo TextsNapsot para dibujar el texto del texto en línea en las páginas. El punto culminante se retiene a fondo en las páginas respectivas a lo largo de la sesión y, posteriormente, se puede actualizar / eliminar sin ningún problema. Todo estaba funcionando bien hasta que hice los siguientes cambios en el enfoque de carga de SWF para habilitar el almacenamiento en caché de la página:

Ahora estoy cargando el objeto SWF Loader en la memoria de la aplicación y mientras realiza saltos de una página a otra página, simplemente estoy copiando el contenido de la página siguiente en el cargador SWF actual que está en la pantalla al usuario. Hay dos conjuntos de cargadores SWF, uno para mostrar la página y otros para almacenar en caché la página (s) siguiente / anterior. En el lado del almacenamiento en caché, cargue el SWF en la memoria de la aplicación y después de cargarlo, escoge todos los contenidos de la página SWF cargada (los niños del clip de la película) en una colección de matriz. Mientras cambia la página, copié el contenido en caché en el clip de película del cargador SWF que está mostrando la página.

Ahora, cuando resalte en la página en la pantalla y navegue hacia atrás / adelante de la página y regrese nuevamente a la página donde hice el resaltado: muestra lo más destacado que hice. Pero tan pronto como intento dibujar otro punto culminante en esa página, el punto culminante anterior se desaparece instantáneamente de la página.

Sospecho que el objeto TEXTSNAPSHOT que se basa en resaltar mientras navega (a la página de visualización de destino) es diferente de la que redita / actualiza el resaltado en la misma página la próxima vez. Aunque la ID de objetos de TextsNapshot para ambos objetos es la misma.

Aquí hay algunos fragmentos de código:

Para copiar el contenido del objeto SWF cargador en caché en la memoria de la aplicación:

    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;

    }

para copiar el contenido en el cargador SWF que está mostrando la página:

    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;

    }

Después de esto, envío completa el cargador SWF, completamente y en el manejador de ese evento, tomo el objeto Snap Shot Object. (MastroManager.as)

Código que utilizo para dibujar manualmente (usando el mouse arrastre en la página).

    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();

            }                

        }            

    }

Código que utilizo para volver a dibujar previamente resaltado cuando vuelvo a la página:

    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);

    }

Esperando su apoyo para resolver este problema.

Saludos,

js

¿Fue útil?

Solución

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top