Domanda

Sto lavorando con un'applicazione del libro digitale. Faccio uso del caricatore SWF per caricare pagine SWF create da PDF. Io uso TESTSSNAPSOT per disegnare Highlight in linea in linea sulle pagine. L'evidenziazione viene accuratamente mantenuto sulle rispettive pagine in tutta la sessione e in seguito può essere aggiornato / cancellato senza alcun problema. Tutto stava lavorando alla grande fino a quando ho effettuato le seguenti modifiche nell'approccio di caricamento SWF per abilitare la cache della pagina:

Sto caricando l'oggetto caricatore SWF nella memoria dell'applicazione e mentre si sta facendo saltare da una pagina all'altra pagina, sto solo copiando il contenuto della pagina successiva al caricatore SWF corrente che si trova sul display all'utente. Esistono due serie di caricatori SWF - uno per la visualizzazione della pagina e altro per cache la pagina successiva / precedente. Sul lato della cache, carico il SWF nella memoria dell'applicazione e dopo averlo caricato prendendo tutti i contenuti della pagina SWF caricata (i bambini della sua clip filmato) in una collezione di array. Durante la modifica della pagina Copia il contenuto memorizzato nella cache nella clip filmato del caricatore SWF che visualizza la pagina.

Ora quando evidenzio sulla pagina in visualizzazione e navigo indietro / indietro dalla pagina e tornando nuovamente alla pagina in cui ho fatto l'evidenziazione: mostra il punto saliente che ho fatto. Ma non appena provo a disegnare un altro highlight su quella pagina, il punto di guardia precedente viene immediatamente scompare dalla pagina.

Sospetto che l'oggetto textsnapshot che disegna evidenziare durante la navigazione (nella pagina del display di destinazione) è diverso da quello che ridisegna / aggiorna l'evidenziazione sulla stessa pagina la prossima volta. Sebbene l'ID oggetto textsnapshot per entrambi gli oggetti sia lo stesso.

Ecco alcuni snippet di codice:

Per la copia del contenuto dallo oggetto SWF Loader memorizzato nella memorizzazione memorizzata nella memoria dell'applicazione:

    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;

    }
.

Per la copia del contenuto sul caricatore SWF che visualizza la pagina:

    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;

    }
.

Dopo questo invio manuale del caricatore SWF e nel gestore di quell'evento prendo il testo SHOT HOPP. (HilltherManager.as)

Codice I uso per disegnare manualmente evidenzia (usando il trascinamento del mouse sulla pagina).

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

            }                

        }            

    }
.

Codice I Uso per ridisegnarsi in precedenza Disegnato Highlight quando torno alla pagina:

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

    }
.

In attesa del supporto per risolvere questo problema.

Saluti,

js

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top