文本突出显示TextSnapshot对象的问题 - Flex AS3

时间:2012-03-01 13:56:05

标签: flex actionscript highlight swfloader

我正在使用数字图书应用程序。我使用swf loader来加载从pdf创建的swf页面。我使用TextSnapsot在页面上绘制内联文本高亮显示。突出显示在整个会话期间完全保留在相应页面上,之后可以毫无问题地更新/删除。一切都很顺利,直到我在swf加载方法中进行了以下更改才能启用页面缓存:

我现在正在将swf加载器对象加载到应用程序内存中,同时从一个页面跳转到另一个页面时,我只是将下一页的内容复制到显示给用户的当前swf加载器。有两组swf加载器 - 一组用于显示页面,另一组用于缓存下一页/上一页。在缓存方面,我将swf加载到应用程序内存中,并在加载它后,我将加载的swf页面(它的影片剪辑的子项)的所有内容选择到数组集合中。在更改页面时,我将缓存的内容复制到swf加载器的显示页面的影片剪辑中。

现在,当我在显示的页面上突出显示并从页面上来回导航并再次回到我突出显示的页面时:它显示了我所做的突出显示。但是,当我尝试在该页面上绘制另一个突出显示时,之前的突出显示会立即从页面中消失。

我怀疑在导航(到目标显示页面)时绘制高亮的Textsnapshot对象与下次在同一页面上重绘/更新高亮显示的对象不同。尽管两个对象的Textsnapshot对象id都相同。

以下是一些代码段:

用于从应用程序内存中缓存的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 个答案:

答案 0 :(得分:1)

你正在做的不是'缓存',而是预加载上一页/下一页。此外,你正在做的是真的糟糕的做法。我甚至不确定你为什么要将这些东西投入到MovieClip中,除非SWF是那样的;如果他们是Flex SWF,他们将成为UIComponents。我建议你重新考虑你的方法。我甚至不打扰复制孩子或任何东西。浏览器加载SWF后,它现在是浏览器缓存的一部分,这意味着下次请求它时,它实际上不会下载它。

如果您想要“缓存”您的SWF以便更快地翻阅下一页/上一页,我建议您使用类似SWFLoader的内容来加载其他SWF,而无需将其实际添加到显示器,然后将其从内存中删除。这将在浏览器中为您缓存SWF。然后,当用户单击上一个/下一个时,只需更改当前显示页面的主swfloader的URL,它将非常快速地加载它。没有下载,因为它已经被缓存,它只需要实例化。