Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Виртуальная клавиатура и фокус текстового поля (http://www.flasher.ru/forum/showthread.php?t=185440)

Logun 12.10.2012 16:38

Виртуальная клавиатура и фокус текстового поля
 
Делаю виртуальную клавиатуру, несколько текстовых полей, когда какое нибудь текстовое поле получает фокус появляется клавиатура, но при нажатии на кнопку виртуальной клавиатуры фокус из текстового поля соответственно пропадает...Гуру подскажите как сделать чтобы фокус не пропадал из текстового поля?

caseyryan 12.10.2012 16:47

В обработчике нажатия кнопки перемещать focus обратно на текстовое поле

Isfet 12.10.2012 16:49

храните ссылку на активный техтфилд, когда он активен, рисуйте вокруг него допустим рамку, зачем вам чтобы он был в фокусе?
а в классе текстфилда создайте функцию setText() и передвавайте туда введеные с виртуальной клавиатуры буквы.

Logun 12.10.2012 17:10

Сенк!

Приложение для интерактивной доски, фокус (мигающий курсор) нужен для наглядности

Добавлено через 1 час 7 минут
Isfet а можно поподробней про setText(), идею не уловил в силу малоопытности)

Isfet 12.10.2012 18:24

ваши текстовые поля будут иметь класс MyTextField допустим , наследуемый от TextField, в нем напишите метод
Код AS3:

public function setText(inputText:String):void{
//в  текстовое поле дописываем текст
    this.appendText(inputText);
}

а в классе контейнере такой код:
Код AS3:

public function setActiveTextFieldText(inputText:String):void{
      //в активное текстовое поле(на которое вы должны хранить ссылку)  дописываем текст
    this.activeTextField.setText(inputText);
}

,если вы конечно работали с классами.

Logun 12.10.2012 19:35

А разве нельзя просто

Код AS3:

public function setActiveTextFieldText(inputText:String):void{
    this.activeTextField.appendText(inputText);
}

???

caseyryan 12.10.2012 19:44

Isfet я думаю лучше было бы отказаться от контейнера, и сразу написать класс расширяющий TextField, в котором будет рисоваться желтая рамка вокруг текста.
А вообще, сама идея правильная. Поддерживаю.
Фокус нужен, если вводить с физической клавиатуры, и то не обязательно. Ведь можно просто перехватывать нажатия клавишь, и вводить их в заранее указанное текстовое поле

Logun 12.10.2012 19:58

Понятно...
Но у меня задачка немного специфическая...как я говорил приложение для интерактивной доски, в определенный момент выводится окошко с настройками сетевой карты специфицеской операционки...вот мне и нужно имитировать поведение этого окошка (в частности фокуса) как в самой операционке... но это все лирика, спасибо за помощь!

caseyryan 12.10.2012 22:16

Данный способ позволит реализовать такой функционал без проблем. Главное реализовать переключение между текстфилдами

Logun 12.10.2012 22:17

Дабы новую тему не создавать спрошу здесь.
Не могу разобраться с dispatchEvent, но нажатию на виртуальную кнопку нужно в TextField вписать соответствующий символ.

Делаю так:
Код AS3:

key.addEventListener(MouseEvent.CLICK, yyyy);
txt.addEventListener(KeyboardEvent.KEY_DOWN, xxxx);
 
function xxxx(evt: KeyboardEvent): void {
        trace(evt.charCode);
}
 
function yyy(e: MouseEvent): void {
        var ev: KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, 50);
        stage.focus = txt;
        dispatchEvent(ev);
}

trace молчит. Где я что не так делаю?

Isfet 13.10.2012 06:39

я как понял, виртуальная клавиатура - это клавиатура которая появляется во флешке, и при нажатии на нее... МЫШКОЙ... происходит записывание символа, который храниться в кнопке в активное текстовое поле.
Возникает вопрос: причем здесь KeyboardEvent? Вам нужно слушать только мышку.

Inet_PC 13.10.2012 10:28

Во первых Вы подписываетесь на функцию yyyy, а на самом деле функция у Вас называется yyy. И во вторых, Вы диспатчите событие вникуда (в данном случае), а нужно (по Вашей логике):
Код AS3:

function yyy(e: MouseEvent): void {
        var ev: KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, 50);
        stage.focus = txt;
        txt.dispatchEvent(ev);
}


Logun 13.10.2012 21:36

Isfet мне нужно чтобы TextField думал, что как будто клавишу на клавиатуре нажали.

Inet_PC, да, ошибся с yyy, но это здесь названия функций исправлял для простоты, во флеше все нормально, т.е. получается я не могу переслать событие всем объектам на сцене, а только конкретному?
Подправил по вашей рекомендации:
Код AS3:

key.addEventListener(MouseEvent.CLICK, yyyy);
txt.addEventListener(KeyboardEvent.KEY_DOWN, xxxx);
 
function xxxx(evt: KeyboardEvent): void {
        trace(evt.charCode);
}
 
function yyyy(e: MouseEvent): void {
        var ev: KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, 50);
        stage.focus = txt;
        txt.dispatchEvent(ev);
}

trace ожил, а вот в TextField тишина, символ не появляется(

Inet_PC 13.10.2012 22:44

Цитата:

trace ожил, а вот в TextField тишина, символ не появляется(
Видимо не получится просто так взять и сымитировать нажатие клавиши. Воспользуйтесь уже данными выше советами: по клику добавляйте букву в Ваше текстовое поле, не забываете про фокус, так же можно запоминать позицию каретки (или просто убрать выделение).

Logun 13.10.2012 23:08

Печально...толку тогда от этого диспатчера в этом конкретном случае, событие создается, передается, реакции ноль...

Попробовал сейчас так:
Код AS3:

function yyyy(e: MouseEvent): void {
        var ev: TextEvent = new TextEvent(TextEvent.TEXT_INPUT, true, false, '2');
        stage.focus = txt;
        txt.dispatchEvent(ev);
}

та же история - тишина.

Цитата:

Воспользуйтесь уже данными выше советами: по клику добавляйте букву в Ваше текстовое поле, не забываете про фокус, так же можно запоминать позицию каретки (или просто убрать выделение).
Так и сделал вчера, но как то не очень это красивая реализация, первое всплывшее неудобство - так я в свойствах TextField задал максимальное количество символов и забыл...а тут вручную контролировать нужно сколько уже введено.

Интересно все же по какому событию в TextField символ рисуется. Может офицеры знают?)

caseyryan 14.10.2012 09:46

Цитата:

а тут вручную контролировать нужно сколько уже введено.
Это такая проблема? Достаточно в обработчик одну строчку добавить
Код AS3:

if (textField.text.length + 1 > maxLength) return;

Да и что-то мне подсказывает, что если текстовому полю задать параметр maxChars, то ничего дополнительно контролировать будет не нужно.

Logun 14.10.2012 14:31

caseyryan не отрабатывает ни maxChars, ни restrict которые у меня заданы.
Цитата:

Это такая проблема? Достаточно в обработчик одну строчку добавить
Нет не проблема конечно, просто по логике вещей, я прописываю поведение объекта в самом объекте, а потом уже посылаю ему события, а тут приходится писать функционал (хоть и не большой) который где то уже в TextField прописан, но видно он отрабатывается только по событиям ввода с клавиатуры, вот я и думал что можно симулировать события от клавиатуры, а appendText, как советовали выше, и собственно, как и пришлось делать, тупо добавляет текст в TextField...

Все это чертова привычка (с других языков) писать красивый грамотный код и не создавать лишнего.

caseyryan 14.10.2012 14:52

Цитата:

Все это чертова привычка (с других языков) писать красивый грамотный код и не создавать лишнего.
Это хорошая привычка, но в одной строчке ничего некрасивого нет. Тут, да, похоже только для ввода с клавиатуры функционал вшит, поэтому вполне нормально добавить дополнительный функционал, имхо.


Часовой пояс GMT +4, время: 09:55.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.