AS3:将 button-behaviors ONLY 放在 container_mc 的 child_mcs 上的最佳方法是什么
AS3: What is the best way to put button-behaviors ONLY on child_mcs of a container_mc
我有一个 container_mc
,里面有很多 child_mcs。我希望 child_mcs 具有完整的 button-like 行为(click-able,光标效果)。
我对在每个 child. 上放置单独的鼠标监听器不感兴趣
...我只想在 parent 容器上设置一个侦听器,尽管 parent 实际上是不活动的...只有 child_mcs.
在 class 中定义按钮的常见行为,并将 class 与库中的按钮符号相关联。
您可以在容器上监听 click
事件,将 useCapture
标志设置为 true
(addEventListener
的第三个参数)——监听器将被调用每次单击任何容器的子级(包括孙级等)时。然后你可以检查哪个按钮被点击了,例如通过检查它的 name
属性.
假设您有这样的东西:
var container_mc:Sprite = new Sprite();
addChild(container_mc);
container_mc.addChild(button1);
container_mc.addChild(button2);
//and so forth with all your buttons
要按照您的要求进行操作,您需要执行以下操作:
//add a click listener to the container
container_mc.addEventListener(MouseEvent.CLICK,click);
//make the buttonMode true on the container, so you get the button hand cursor
container_mc.buttonMode = true;
function click(e:Event):void {
//e.target is a reference to what was clicked (see caveat after code sample)
//if all the children of container_mc are of the same custom class,
//you could now call a click handler on that item
MyButtonClass(e.target).myClickHandler(e);
//or you could use a switch statement
switch(e.target){
case button1:
//button 1 was clicked, do something with it
break;
case button2:
//button 2 was clicked, do something with it
break;
}
}
这里唯一需要注意的是,事件的目标可以是任何 child 容器的下行。因此,如果 button1
有一些 children 而那些 children 有 children,则 e.target
中引用的 object 可以是其中任何一个(曾经被点击过)。如果您的按钮内有 child object,那么确保您的目标始终是按钮的最简单方法是执行以下操作:
button1.mouseChildren = false;
这将确保按钮调度的任何鼠标事件都将 button1
作为目标,而不是任何 children。
please ignore the downvote ... if your problem is the same as mine,
then this solution works
//-- pseudo code --\
*for the container:*
container.addEventListener( MouseEvent.MOUSE_DOWN , callback_function ) ;
container.buttonMode ...... false
container.mouseEnabled .... false
container.mouseChildren ... true
*for each child:*
child.buttonMode ...... true
child.mouseEnabled .... true
child.mouseChildren ... false
我有一个 container_mc
,里面有很多 child_mcs。我希望 child_mcs 具有完整的 button-like 行为(click-able,光标效果)。
我对在每个 child. 上放置单独的鼠标监听器不感兴趣 ...我只想在 parent 容器上设置一个侦听器,尽管 parent 实际上是不活动的...只有 child_mcs.
在 class 中定义按钮的常见行为,并将 class 与库中的按钮符号相关联。
您可以在容器上监听 click
事件,将 useCapture
标志设置为 true
(addEventListener
的第三个参数)——监听器将被调用每次单击任何容器的子级(包括孙级等)时。然后你可以检查哪个按钮被点击了,例如通过检查它的 name
属性.
假设您有这样的东西:
var container_mc:Sprite = new Sprite();
addChild(container_mc);
container_mc.addChild(button1);
container_mc.addChild(button2);
//and so forth with all your buttons
要按照您的要求进行操作,您需要执行以下操作:
//add a click listener to the container
container_mc.addEventListener(MouseEvent.CLICK,click);
//make the buttonMode true on the container, so you get the button hand cursor
container_mc.buttonMode = true;
function click(e:Event):void {
//e.target is a reference to what was clicked (see caveat after code sample)
//if all the children of container_mc are of the same custom class,
//you could now call a click handler on that item
MyButtonClass(e.target).myClickHandler(e);
//or you could use a switch statement
switch(e.target){
case button1:
//button 1 was clicked, do something with it
break;
case button2:
//button 2 was clicked, do something with it
break;
}
}
这里唯一需要注意的是,事件的目标可以是任何 child 容器的下行。因此,如果 button1
有一些 children 而那些 children 有 children,则 e.target
中引用的 object 可以是其中任何一个(曾经被点击过)。如果您的按钮内有 child object,那么确保您的目标始终是按钮的最简单方法是执行以下操作:
button1.mouseChildren = false;
这将确保按钮调度的任何鼠标事件都将 button1
作为目标,而不是任何 children。
please ignore the downvote ... if your problem is the same as mine, then this solution works
//-- pseudo code --\
*for the container:*
container.addEventListener( MouseEvent.MOUSE_DOWN , callback_function ) ;
container.buttonMode ...... false
container.mouseEnabled .... false
container.mouseChildren ... true
*for each child:*
child.buttonMode ...... true
child.mouseEnabled .... true
child.mouseChildren ... false