не удается сфокусироваться на холсте

Я создаю холст в 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: неявное принуждение значения со статическим типом объекта к возможно несвязанному типу mx.managers:IFocusManagerComponent».

в основном я просто хочу использовать событие фокуса на холсте.

Может ли кто-нибудь помочь мне с этим... Я давно занимаюсь этим вопросом.

С уважением Зишан


person Zeeshan Rang    schedule 13.12.2009    source источник
comment
Вы импортировали указанную библиотеку?   -  person Treby    schedule 14.12.2009


Ответы (4)


Ошибка правильная. У вас есть объект типа 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 вы слушаете правильный объект. В противном случае вы можете ошибочно вызывать одну и ту же функцию несколько раз.

person cwallenpoole    schedule 17.12.2009

Только несколько классов реализуют 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");
}
person Amarghosh    schedule 18.12.2009
comment
это работает в приложении AIR? Я получаю эту ошибку с flex 4.5 sdk 1144: Interface method drawFocus in namespace mx.managers:IFocusManagerComponent is implemented with an incompatible signature in class - person Santhosh Nayak; 09.07.2013

Я вижу две проблемы и идеальных решений нет. Если повезет, это может вам помочь.

Прежде всего, e.target возвращает приведение типа объекта к типу Object. Это объясняет вашу неявную ошибку принуждения, потому что Object не реализует IFocusManagerComponent.

Во-вторых, iFocusManagerComponent реализуется только Accordion, AdvancedListBase, Button, ButtonBar, ChartBase, ComboBase, DateChooser, DateField, HTML, ListBase, MenuBar, NumericStepper, TabNavigator, TextArea, TextInput, UIMovieClip согласно эту запись в справочнике по Flex 3.4 AS3.

Это наводит меня на мысль, что элемент Canvas не может получить фокус и просто унаследовал доступ к FocusManager через наследование UIComponent.

Единственные решения, которые я вижу, - это использовать что-то другое, кроме Canvas, для решения ваших проблем, связанных с фокусом, или подкласс Canvas и реализовать iFocusManagerComponent, хотя это выглядит довольно сложно.

Изменить Приносим извинения за отсутствие функции drawFocus в приведенном выше решении.

person Aaron    schedule 16.12.2009

Попробуйте;

private function get_focus_on_canvas(e:FlexEvent)
{
    this.cvs_preview.setFocus();
}
person aslanpayi    schedule 09.06.2013