0

我正在使用数字图书应用程序。我使用 swf 加载器来加载从 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

4

1 回答 1

1

您所做的不是“缓存”,而是预加载上一页/下一页。另外,您正在做的事情确实很糟糕。我什至不确定您为什么要将这些东西投射到 MovieClip 中,除非 SWF 是那样的;如果它们是 Flex SWF,它们将是 UIComponent。我建议你重新考虑你的方法。我什至不会费心复制孩子或其他任何东西。浏览器加载 SWF 后,它现在是浏览器缓存的一部分,这意味着下次请求它时,它实际上不会下载它。

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

于 2012-03-01T18:41:57.323 回答