【问题标题】:Scrollbar not working with TLF text with dynamic content in ActionScript 3滚动条不适用于 ActionScript 3 中具有动态内容的 TLF 文本
【发布时间】:2012-01-13 19:16:52
【问题描述】:

我正在使用 Flash CS5 和 ActionScript 3 创建一个简单的 Flash 项目。

我想要做的是我想动态更新具有给定源和目标的 TLF 文本容器,例如 loadData(text_placeX, "markup.xml"); 任何我想要的地方。

它就像一个魅力,但问题是我不能为我的文本使用任何滚动条。我在文本容器中添加了一个UIScrollBar,它正在使用我放入文本容器中的默认文本,但是当我用我的数据更新容器时它不起作用。我错过了什么?

另一个问题是如何在我的文本容器中加载新数据之前清空它?

我的代码是:

import fl.text.TLFTextField;
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.text.TextFieldAutoSize;
import flashx.textLayout.container.ContainerController;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.conversion.TextConverter;
import fl.controls.ScrollBar;

var ldr:URLLoader = new URLLoader();
var flow:TextFlow = new TextFlow();

function loadData(text_place, fileURL:String):void {
    text_place.border = true;
    ldr.dataFormat = URLLoaderDataFormat.TEXT;
    ldr.addEventListener(Event.COMPLETE, function(evt:Event){ ldr_complete(text_place) }, false, 0, true);
    ldr.load(new URLRequest(fileURL));
    ldr.addEventListener(IOErrorEvent.IO_ERROR, loadError);
}

function ldr_complete(text_place:TLFTextField):void {
    ldr.removeEventListener(Event.COMPLETE, ldr_complete);
    ldr.removeEventListener(IOErrorEvent.IO_ERROR, loadError);
    initText(text_place, ldr.data);
}

function loadError(e:IOErrorEvent):void {
    trace("Error loading an external file. The server may be busy. Try refreshing the page.");
}

function initText(text_place:TLFTextField, fileContent):void {
    flow = TextConverter.importToFlow(fileContent, TextConverter.TEXT_FIELD_HTML_FORMAT);
    flow.flowComposer.addController(new ContainerController(text_place, text_place.width, text_place.height));
    flow.flowComposer.updateAllControllers();
}

更新:当我跳过使用initText 函数内容而使用text_place.tlfMarkup = fileContent; 时,它可以工作;但我在TextFlow 上的选项不见了。在将内容放入文本字​​段后,我还缺少“更新滚动条”。

【问题讨论】:

  • 我本来打算看看这个,但我不知道你的舞台元素是如何布置的。你有没有机会把你的 fla 放到一个 FTP 上,这样我就可以下载它并查看一下?

标签: actionscript-3 flash-cs5 tlf


【解决方案1】:

我认为这行可能是问题所在:

ldr.addEventListener(Event.COMPLETE, function(evt:Event){ ldr_complete(text_place) }, false, 0, true);

这里有一个匿名函数 (function(evt:Event){...),它将对象 text_place 传递给函数 ldr_complete()。但是,您无权访问text_place,因为它是在不同范围内声明的变量。如果您将该功能设置为命名功能,您将不会假设您具有该访问权限。例如,

function loadCompleteHnd(evt:Event):void{
[...]
}

但是,您仍然需要访问 text_place 中的对象。因此,您可以将text_place 设为类级别(全局)变量,并随时设置该变量。但这可能会带来创建竞争条件的风险——如果加载速度较慢,您可能会尝试同时从两个位置更改该对象。

另一种选择是创建一个全新的Event,它扩展了Event.COMPLETE 设置。此时,您可以创建另一个参数供Event.COMPLETE 侦听器使用。这很复杂,并且有点学习曲线,但它使事件更加通用。

在任何一种情况下,您都可能需要设置一个标志来告诉您是否有其他人正在编辑同一个对象。这不是万无一失的,但它可以省去一些麻烦。

【讨论】:

  • 感谢您的解决方案,但我需要向仅捕获事件的函数发送两个参数;所以我这样做了。我逐行检查了我的代码,结果发现问题出在 textflow 中,不使用它,我的代码就像一个魅力,但我错过了太多没有 textflow 的选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2013-05-14
  • 2019-11-20
  • 2019-06-12
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多