我在动作脚本中创建一个画布,如:
private var cvs_preview:Canvas = null;
private function show_preview():void
{
this.cvs_preview = new Canvas();
this.cvs_preview.id = "cvs_preview_1";
this.cvs_preview.setStyle('backgroundColor', 0x000000);
this.cvs_preview.setStyle('backgroundAlpha', 1);
this.cvs_preview.setStyle('borderColor', 0x417FDD);
this.cvs_preview.setStyle('cornerRadius', 10);
this.cvs_preview.setStyle('borderStyle', 'solid');
this.cvs_preview.setStyle('dropShadowEnabled', true);
var pt:Point = image.localToGlobal(new Point(image.x, image.y));
this.cvs_preview.x = pt.x - 50;
this.cvs_preview.y = pt.y - 50;
this.cvs_preview.height = 200;
this.cvs_preview.width = 250;
//this.cvs_preview.addEventListener(FlexEvent.CREATION_COMPLETE, get_focus_on_canvas);
//this.cvs_preview.focusManager.setFocus(
//this.cvs_preview.addEventListener(MouseEvent.CLICK, end_preview_on_focus_change);
this.cvs_preview.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, end_preview_on_focus_change);
Application.application.addChild(this.cvs_preview); //add as top-most visible container
btn_mini_preview.enabled = false;
}
所以焦点改变我想运行“end_preview_on_focus_change()”
但这不起作用。
根据我的理解,我认为画布首先没有得到任何关注。在画布创建完成后,我试图使用focusManager.setFocus来做到这一点。但即使这样也给了我一个错误。
我正在尝试使用Creation.Complete的代码是:
private function get_focus_on_canvas(e:FlexEvent)
{
focusManager.setFocus(e.target);
//Alert.show("testing img complete");
}
这给了我一个错误“1118:使用静态类型Object将值隐式强制转换为可能不相关的类型mx.managers:IFocusManagerComponent。”
基本上我只是想使用画布的焦点输出事件。
有人可以帮我这个...... 很长一段时间以来,我一直在讨论这个问题。
此致 Zeeshan
答案 0 :(得分:2)
错误是正确的。您有Object
类型的对象,您尝试将其用作IFocusManagerComponent
。这不行。要完成这一行代码,您需要执行类似
focusManager.setFocus( IFocusManagerComponent( e.target ) );
当然,这假定目标实现IFocusManagerComponent
。否则会给你一个错误(在这种情况下可能会因为Canvas
没有列为IFocusManagerComponent)。好消息是Canvas
确实有一个drawFocus
方法可以完成同样的事情。
对于你的MOUSE_FOCUS_CHANGE
事件,只有当某个对象已经聚焦然后丢失它时才会被触发。我认为你最好使用FlexEvent.CREATION_COMPLETE
。这将确保组件已在Flex SDK中注册了所有相应的类,以便FocusManager甚至可以知道新对象。无论你做什么,都不要试着把注意力放在尚未添加到舞台上的东西上(即:调用了Event.ADDED)。
作为另一条建议 - Event.ADDED气泡,请确保event.currentTarget == event.target
以确保您正在侦听正确的对象。否则,您可能会错误地多次调用相同的函数。
答案 1 :(得分:2)
只有少数几个类会像其他人提到的那样实现IFocusManagerComponent
,而Canvas
不是其中之一。如果你真的必须调用FocusManager.setFocus()
,你必须扩展canvas类来实现这个接口并改用它。您不必编写任何方法来实现此接口,所有方法都已由UIComponent
本身实现
//FocusableCanvas.as (include appropriate package and import statements)
public class FocusableCanvas extends Canvas implements IFocusManagerComponent
{
public function FocusableCanvas()
{
super();
}
}
//Now use this class instead of Canvas
this.cvs_preview = new FocusableCanvas();
//setFocus in creation complete handler
FocusManager.setFocus(IFocusManagerComponent(e.target));
但是如果你想要做的就是在创建它时将焦点设置在画布上,你可以改为从canvas.setFocus()
处理程序调用{{1}}。
creationComplete
答案 2 :(得分:1)
我看到两个问题,没有完美的解决方案。运气好的话,这可以帮到你。
首先,e.target返回一个Object类型的对象类型转换。这解释了您的implict强制错误,因为Object没有实现IFocusManagerComponent。
其次,iFocusManagerComponent仅由Accordion,AdvancedListBase,Button,ButtonBar,ChartBase,ComboBase,DateChooser,DateField,HTML,ListBase,MenuBar,NumericStepper,TabNavigator,TextArea,TextInput,UIMovieClip按照this entry实现。 Flex 3.4 AS3参考。
这让我相信Canvas元素无法获得焦点,只是通过继承UIComponent继承了对FocusManager的访问权。
我能看到的唯一解决方案是利用Canvas之外的其他东西来处理与焦点相关的问题,或者将Canvas子类化并实现iFocusManagerComponent,尽管这看起来相当复杂。
修改强> 在上述解决方案中遗漏了drawFocus的道歉。
答案 3 :(得分:-1)
请尝试;
private function get_focus_on_canvas(e:FlexEvent)
{
this.cvs_preview.setFocus();
}