0

我正在 actionscript 中创建一个画布,例如:

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。”

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

有人可以帮我解决这个问题吗?我很久以来一直在这个问题上。

问候泽山

4

4 回答 4

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

于 2009-12-17T18:22:16.523 回答
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));

但是,如果您只想在创建画布时将焦点设置在画布上,则可以改为canvas.setFocus()从处理程序调用。creationComplete

private function get_focus_on_canvas(e:FlexEvent)
{
    Canvas(e.currentTarget).setFocus();
    trace("done");
}
于 2009-12-18T07:28:58.733 回答
1

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

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

其次,根据 Flex 3.4 AS3 参考中的此条目,iFocusManagerComponent 仅由 Accordion、AdvancedListBase、Button、ButtonBar、ChartBase、ComboBase、DateChooser、DateField、HTML、ListBase、MenuBar、NumericStepper、TabNavigator、TextArea、TextInput、UIMovieClip实现。

这让我相信 Canvas 元素无法获得焦点,并且通过 UIComponent 的继承简单地继承了对 FocusManager 的访问。

我能看到的唯一解决方案是使用 Canvas 以外的东西来处理与焦点相关的问题,或者子类化 Canvas 并实现 iFocusManagerComponent,尽管这看起来相当复杂。

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

于 2009-12-16T21:04:53.413 回答
-1

请试试;

private function get_focus_on_canvas(e:FlexEvent)
{
    this.cvs_preview.setFocus();
}
于 2013-06-09T15:06:39.490 回答