【发布时间】:2014-12-18 18:19:01
【问题描述】:
我已经能够使用自定义图像 (loading Skin images dynamically) 为 ToggleButton 设置皮肤,并且运行良好。
我想添加的最后一个功能是将交互性(mouseEvents)限制为不透明像素。我一直在四处寻找,发现InteractivePNG 和Creating a hitarea for PNG Image with transparent (alpha) regions in Flex。 InteractivePNG在初始测试中的结果不稳定,所以我想我会尝试使用第二个链接中的代码定义 ToggleButton hitArea 属性。
我无法让它工作。我用于生成 Sprite 以定义命中区域的代码如下。 (我也尝试了一个简单的 Sprite,其中绘制了一个矩形。)当我设置 togglebutton.hitArea 时,我没有收到任何错误,但它不再是交互式的。
是否需要将定义 hitArea 的 Sprite 添加到它所应用到的对象的 DisplayList 中? 如果需要,我如何使用 ToggleButton 的子类来做到这一点? p>
hitSprite = createHitArea(upImageData, 1);
hitSprite.mouseEnabled = false;
this.hitArea = hitSprite;
当然,在 ToggleButton 上调用 `addChild() 会引发错误。
this.addChild(hitSprite);
我试过了:
将我的自定义 ToggleButton 包装在 Spark 组中,然后包装一个 MX UIComponent,这样我就可以使用 SpriteDisplayElement 来添加东西——但这不起作用。
在我的自定义 ToggleButton 定义中添加 Sprite - 这样做会出错。
我在这里使用 ToggleButton 类来实现这种功能是不是很不走运?我不明白为什么 ToggleButton 有一个 hitArea 属性,如果没有办法设置它 - 但事实并非如此,所以我一定做错了什么。
更新
我刚刚尝试了这种方法(Flex 4 Custom Component - How to notify skin of property changes?)绑定到在 ToggleButton 中创建的SpriteVisualElement - 但在设置 hitArea 时仍然没有成功 - 无论是 ToggleButton 还是它正在使用的皮肤。
public function createHitArea(bitmapData:BitmapData, grainSize:uint=1):SpriteVisualElement
{
var _hitarea:SpriteVisualElement = new SpriteVisualElement();
_hitarea.graphics.beginFill(0x000000, 1.0);
for(var x:uint=0;x<bitmapData.width;x+=grainSize) {
for(var y:uint=grainSize;y<bitmapData.height;y+=grainSize) {
if(x<=bitmapData.width && y<=bitmapData.height && bitmapData.getPixel(x,y)!=0) {
_hitarea.graphics.drawRect(x,y,grainSize,grainSize);
}
}
}
_hitarea.graphics.endFill();
_hitarea.cacheAsBitmap = true;
return _hitarea;
}
]]>
【问题讨论】:
-
FWIW - 经过很长时间的研究,我放弃了,只是用直接的动作脚本写了整个事情。 Flex 中的“快速开发”就这么多。令人沮丧、过于复杂和不一致的文档、错误和死胡同。我喜欢 Flex 提供的一些糖,但它的成本太高了。
标签: actionscript-3 apache-flex flex4