O Realce do texto do problema com TextSnapshot objeto - Flex / AS3
-
14-11-2019 - |
Pergunta
Eu estou trabalhando com o livro digital aplicação.Eu uso swf carregador para carregar swf páginas criadas a partir de pdf.Eu uso TextSnapsot para desenhar a linha de texto com destaque nas páginas.O destaque é cuidadosamente mantido nas respectivas páginas durante toda a sessão e, mais tarde, ele pode ser atualizado/eliminados sem qualquer problema.Tudo estava funcionando muito bem até que eu feitas as seguintes alterações no swf carregar abordagem para habilitar o cache de página:
Agora estou a carregar swf carregador de objeto em memória de aplicativo e, ao fazer saltar de uma página para outra página eu sou apenas copiando o conteúdo da próxima página para o atual swf loader que é a apresentação para o usuário.Há dois conjuntos de swf carregadores - um para exibir a página e outro para armazenar em cache a página seguinte/anterior(es).Sobre a colocação em cache do lado, eu carregar o swf na memória da aplicação e depois de ser carregado eu pegar todo o conteúdo do swf carregado página (os filhos de clipe de filme) em uma matriz de coleta.Ao alterar a página de eu copiar o conteúdo em cache no swf carregador do clipe de filme que está a apresentar a página.
Agora, quando eu destaque na página exibir e navegar/quarto de página e volta novamente para a página onde eu fiz a destacar:Ele mostra o destaque que eu fiz.Mas assim que eu tentar tirar outro destaque na página, o destaque é instantaneamente desaparece da página.
Eu suspeito que o Textsnapshot objeto que atrai destaque durante a navegação (para o destino de exibição de página é diferente do que redesenha/atualização de destaque na mesma página da próxima vez.Embora o Textsnapshot identificação do objeto para ambos os objetos é a mesma.
Aqui estão algumas trecho de código:
Para copiar o conteúdo do swf carregador de objeto armazenado em cache na memória de aplicativo:
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 o conteúdo para o swf loader que está exibindo a 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;
}
depois disso, eu envio swf carregador completo manualmente e no manipulador de evento que eu tome o texto snap shot objeto.(highlightManager.como)
O código que eu uso para desenhar destaque manualmente(usando o arrastar do mouse na 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();
}
}
}
O código que eu uso para redesenhar desenhados anteriormente destaque quando eu voltar para a 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);
}
Olhando para a frente para o seu apoio para resolver este problema.
Cumprimentos,
JS
Solução
O que você está fazendo não é 'cache', é pré-carregamento anteriores/próximas páginas.Também, o que você está fazendo é realmente má prática.Não sei por que você está carcaça essas coisas em MovieClips, a menos que o Fs que são;se eles estão Flex fundos soberanos, que vai ser UIComponents.Eu recomendaria você repensar a sua abordagem.Eu não me incomodei mesmo copiar as crianças ou qualquer coisa mais.Uma vez que o navegador carrega uma SWF, ele agora faz parte do cache do navegador, ou seja, a próxima vez que é solicitada, ela não vai realmente fazer o download.
Se você deseja 'cache' seus SWFs para uma mais rápida de anterior/seguinte página virar, eu recomendo que você use algo como SWFLoader apenas para carregar outros SWFs sem, na verdade, adicionando-lo para o ecrã e, em seguida, removê-lo da memória.Que irá armazenar em cache os fundos soberanos para você no navegador.Em seguida, quando o usuário clique em anterior ou para a próxima, basta alterar a url do principal swfloader da página atualmente exibida e ele irá carregá-lo muito rapidamente.Nenhum download, pois já está em cache, ele só precisa criar uma instância.