Question

Je travaille avec une application de livre numérique. J'utilise le chargeur SWF pour charger des pages SWF créées à partir de PDF. J'utilise Textsnapsot pour dessiner la surbrillance en ligne sur les pages. La surbrillance est entièrement retenue sur les pages respectives tout au long de la session et, plus tard, elle peut être mise à jour / supprimée sans aucun problème. Tout fonctionnait bien jusqu'à mes modifications suivantes dans l'approche de chargement SWF pour permettre la mise en cache de page:

Je charge maintenant l'objet SWF Charger dans la mémoire d'application et tout en faisant passer d'une page à une autre page, je suis simplement copier le contenu de la page suivante sur le chargeur SWF actuel qui se trouve à l'écran de l'utilisateur. Il existe deux ensembles de chargeurs SWF - une pour afficher la page et autre pour mettre en cache la ou les pages suivantes / précédentes. Sur le côté de la mise en cache, je charge le SWF dans la mémoire de l'application et après avoir été chargé, je choisis tout le contenu de la page SWF chargé (les enfants de sa clip de film) dans une collection Array. Lors de la modification de la page, je copie le contenu mis en cache dans le clip vidéo du loader SWF qui affiche la page.

Maintenant, lorsque je souligne la page sur l'affichage et naviguez à partir de la page et de retour de la page et de retour à la page où j'ai fait la surbrillance: elle montre le point culminant que j'ai fait. Mais dès que j'essaye d'attirer un autre point de surbrillance sur cette page, la surbrillance précédente disparaît instantanément de la page.

Je soupçonne que l'objet TextsNapshot qui attire la surbrillance lors de la navigation (vers la page d'affichage cible) est différent de celui qui redessine / met à jour la surbrillance de la même page la prochaine page. Bien que l'ID d'objet TextsNapShot pour les deux objets soit identique.

Voici quelques extraits de code:

Pour copier le contenu de l'objet de chargeur SWF mis en cache dans la mémoire de l'application:

    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;

    }

Pour copier le contenu sur le chargeur SWF qui affiche la page:

    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;

    }

Après cela, je me suis terminé manuellement et dans le gestionnaire de cet événement, je prends l'objet Text Snap Shot. (HighlightManager.As)

code que j'utilise pour dessiner manuellement (à l'aide de la glisser de la souris sur la page).

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

            }                

        }            

    }

code que j'utilise pour redessiner précédemment tiré de la surbrillance lorsque je retourne à la page:

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

    }

Dans l'attente de votre soutien pour résoudre ce problème.

Cordialement,

js

Était-ce utile?

La solution

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top