【发布时间】:2012-07-05 19:24:28
【问题描述】:
处理(如标题所述)带有鼠标悬停的动态加载选项的菜单。
我看到的事件链(这可能是有缺陷的)是:
•使用循环为 XML 文件中的每个条目放置一个空的影片剪辑,每次下降多个像素。我们将这些称为“条目”。
•在每个条目中添加一个 textField(来自 XML 的文本),绘制一个 alpha=0 的矩形(作为鼠标悬停时的突出显示),然后从库中添加另一个影片剪辑。
•将 mouseover 和 mouseout eventListeners 添加到每个“条目”,将不可见矩形设置为 alpha=1,并从库中更改文本和影片剪辑的颜色。
以下是启动所有这些的函数。 *编辑:修复了更多非常愚蠢的东西。
//Load List Options
function loadHighlight():void
{
var yTmp:Number = 0;
for (var i:Number = 0; i < photo_total; i++)
{
var Highlight:MovieClip = new MovieClip();
photoHighlights[i] = Highlight;
photoHighlights[i].addEventListener(MouseEvent.MOUSE_OVER, highlightOvr);
//Draw Invisible Rectangle
var rectngle:Shape = new Shape();
rectngles[i] = rectngle;
rectngles[i].graphics.beginFill (0x0DAC54);
rectngles[i].graphics.drawRect(0, 0, 1170, 144);
rectngles[i].graphics.endFill();
rectngles[i].alpha = 0;
rectngles[i].y=yTmp;
rectngles[i].x= 0;
photoHighlights[i].addChildAt(rectngles[i], 0);
//Load photosArray
var photoname = photo_data[i].@TEXT;;
var photolist:TextField = new TextField();
photosArray[i] = photolist;
photosArray[i].textColor = 0x0DAC54;
photosArray[i].x = 26.95;
photosArray[i].y = 92.65;
photosArray[i].embedFonts = true;
photosArray[i].antiAliasType = AntiAliasType.ADVANCED;
photosArray[i].defaultTextFormat = listformat;
photosArray[i].selectable = false;
photosArray[i].wordWrap = true;
photosArray[i].text = photoname;
photosArray[i].autoSize = TextFieldAutoSize.LEFT;
photosArray[i].mouseEnabled = false;
photoHighlights[i].addChildAt(photosArray[i], 1);
//Load thumbFrames
var thumbFrame:thmbFrame = new thmbFrame();
thumbFrame.x= 962;
thumbFrame.y= 21;
photoHighlights[i].addChildAt(thumbFrame, 1);
thmbFrames.push(thmbFrame);
MediaPage.photoSelect.photoList.addChild(photoHighlights[i]);
yTmp = yTmp + 153;
}
}
function highlightOvr(event:MouseEvent):void
{
event.target.rectngles.alpha=1;
event.target.photosArray.textColor = 0x000000;
event.target.thmbFrames.color = 0x000000;
event.target.addEventListener(MouseEvent.MOUSE_OUT, highlightOut);
}
function highlightOut(event:MouseEvent):void
{
event.target.rectngles.alpha = 0;
event.target.photosArray.textColor = 0x0DAC54;
event.target.thmbFrames.color = 0x0DAC54;
event.target.removeEventListener(MouseEvent.MOUSE_OUT, highlightOut);
}
现在的问题已经变成了引用已放置的movieClips 的子代的问题。我知道这是不对的:
event.target.rectngles.alpha = 0;
我只是不知道是什么。如何引用生成的movieClips 及其子项?
我知道有一个简单的方法可以做到这一点,但我不知道它是什么。
此外,根据 ShaunHusain 的回应,我这样做的方式似乎有点令人费解。非常感谢任何指向措辞清晰的资源的链接,这些资源解释了实现这一目标的更有效方法。
再次感谢, -T。
编辑:修复了我所做的一些非常愚蠢的事情。
【问题讨论】:
-
仅供参考,这不是“常规”方式,在 Flash 和 Flex UI 组件中,都可以为列表定义渲染器,这就是您通常绘制的地方每个元素。列表控件执行称为项目渲染器回收的事情,它将创建渲染器的对象池,以在用户滚动时使用和重用这些渲染器(向它们应用新数据并调整它们的位置)。严格来说,您所做的并没有错,但是手动执行此操作将失去渲染器回收的性能优势。 (对于一个小列表来说没什么大不了的)
-
嗨,肖恩,谢谢你的提示!不幸的是,你所说的一切都超出了我的想象。不过,我真的很想了解它。有什么地方可以读到吗?如果可能的话,在某个地方可以很简单地分解它?在这一点上我很绿。
-
你有在你的 for 循环中定义的函数还是一个错字?
-
是的,这些函数是在我的循环中定义的。我听说这是错误的,但是,我不知道如何引用对象......好吧,没关系。这很明显。所以现在函数在循环之外。仍然存在“术语未定义且没有属性”的问题。我更新了原帖。
标签: xml actionscript-3 flash-cs5