无法专注于画布

时间:2009-12-13 01:04:22

标签: flex action

我在动作脚本中创建一个画布,如:

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

4 个答案:

答案 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();
}