2009-12-13 106 views
0

我创建一个画布一样动作:无法得到集中在画布上

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:静态类型对象的值隐式强制为可能无关的类型mx.managers:的IFocusManagerComponent “。

基本上我只想使用画布的焦点输出事件。

有人可以帮助我... 我一直在这个问题上很长一段时间。

问候 Zeeshan

+0

您是否导入了该库? – Treby 2009-12-14 03:25:13

回答

1

我看到两个问题,没有完美的解决方案。幸运的是,这可以帮助你。

首先,e.target返回一个Object类型的对象类型转换。这解释了你的隐含强制错误,因为Object没有实现IFocusManagerComponent。

二的IFocusManagerComponent仅由手风琴,AdvancedListBase,按钮,按钮栏,ChartBase,ComboBase,DateChooser,的DateField,HTML,ListBase,菜单栏,的NumericStepper,TabNavigator的,文本区域,的TextInput,检测UIMovieclip在Flex 3.4 AS3实现为每this entry参考。

这使我相信一个Canvas元素不能获得焦点并且通过继承UIComponent继承了对FocusManager的访问。

唯一的解决方案,我可以看到的是利用比帆布以外的东西来处理你的注意力有关的问题,或子类Canvas和实施的IFocusManagerComponent,虽然看起来相当复杂。

编辑 对于在上述解决方案中缺少drawFocus的道歉。

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确保您正在聆听正确的对象。否则,您可能会错误地多次调用相同的函数。

2

只有几个类实现IFocusManagerComponent作为其他人提到和Canvas不是其中之一。如果您确实必须致电FocusManager.setFocus(),则必须扩展画布类以实现此接口并改为使用该类。您没有写任何的方法来实现这个接口,所有的方法已经由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)); 

但是,如果你想要做的是将焦点设置在画布上后,它的创作,您可以改为从creationComplete处理程序调用canvas.setFocus()

private function get_focus_on_canvas(e:FlexEvent) 
{ 
    Canvas(e.currentTarget).setFocus(); 
    trace("done"); 
} 
+0

它是否适用于AIR应用程序?我得到这个错误与flex 4.5 sdk '1144:接口方法drawFocus在命名空间mx.managers:IFocusManagerComponent实现一个不兼容的签名类' – 2013-07-09 10:58:05

-1

请尝试;

private function get_focus_on_canvas(e:FlexEvent) 
{ 
    this.cvs_preview.setFocus(); 
}