PDA

Просмотр полной версии : Как определить что курсор на скроллере


johannes
12.05.2009, 02:19
Делаю чат на flash (AS2). Прикрутил стандартный скроллер к динамическому текстовому полю. При появлении нового сообщения весь чат скроллится до самого низа
chat_txt.scroll = chat_txt.maxscroll;
надо сделать чтобы когда курсор находится на скроллере (т.е. пользователь прокручивает чат вверх чтобы прочесть прежние сообщения) в этот момент maxscroll не срабатывал. Ни одно событие применимое к UIScrollbar не смог применить. Есть какие-то решения?

mooncar
12.05.2009, 02:35
Может быть заносить значение scroll в переменную и делать моментальный откат после срабатывания механизма компонента? Сделать это для пользователей незаметным.
Мне тоже предстоит скоро решить эту задачу.

johannes
12.05.2009, 16:05
Может быть заносить значение scroll в переменную и делать моментальный откат после срабатывания механизма компонента? Сделать это для пользователей незаметным.
Мне тоже предстоит скоро решить эту задачу.
не покатит...
Есть еще у кого какие варианты?

Добавлено через 3 часа 12 минут
Вобщем пока придумал такое решение: вычислил координаты области скроллбара и если курсор находится в пределах этих координат, то чат не скроллится автоматически при появлении нового сообщения :D:D

Kuruki
12.05.2009, 20:17
var srollFlag:Boolean = true;
...
if(srollFlag) chat_txt.scroll = chat_txt.maxscroll;
...
sbar.onMouseDown = function(){
srollFlag = false;
}
sbar.onMouseUp = function(){
srollFlag = true;
}

johannes
12.05.2009, 20:35
спасибо! сейчас попробую!

Добавлено через 25 минут
var srollFlag:Boolean = true;
...
if(srollFlag) chat_txt.scroll = chat_txt.maxscroll;
...
sbar.onMouseDown = function(){
srollFlag = false;
}
sbar.onMouseUp = function(){
srollFlag = true;
}

хм.. этот код действует не только на нажатие скроллера, а на нажатие мыши в любом месте флешки :(

mooncar
12.05.2009, 21:12
var srollFlag:Boolean = true;
...
if(srollFlag) chat_txt.scroll = chat_txt.maxscroll;
...
sbar.onMouseDown = function(){
srollFlag = false;
}
sbar.onMouseUp = function(){
srollFlag = true;
}
Это я еще нынче ночью придумал - не годится.

По сути у компонента вообще до отпускания ползунка нужно убивать привязку к целевому полю, иначе не только вниз уйдет текст, но и размер ползунка будет меняться.
А после отпускания ползунка - делать для него заново привязку через selectTraget() и возможно, делать update() (в AS3 эти методы, как я понял, существуют для UIScrollBar).

Потом начал потрошить сам компонент на предмет привязки активации к ползунку.
Надо в этом направлении работать. В AS3 у UIScrollBar есть полно унаследованных методов, там список на целый экран, а вот для AS2 в старой книжке для MX2004 (другой лит-ры у меня нет) упоминаются только, что UIScrollBar порождает события "scrolled", "complited" и еще два-три, связанные с загрузкой целевого поля, - все не то.
Нужна либо дока нормальная, где описаны всевозможные структуры компонентов а-ля mx.controls.SimpleButton либо совет кого поопытнее. В общем, с компонентами я пока не дружу, а вот кто-то еще может подскажет.

johannes
16.05.2009, 01:07
up. Есть какоето решение вопроса? Очень надо

silin
16.05.2009, 01:14
к ранее обсуждавшемуся варианту: может быть как-то так
sbar.onMouseDown = function(){
srollFlag = !this.hitTest(_root._xmouse,_root._ymouse);
}

mooncar
16.05.2009, 02:25
Ползунок находится внутри компонента.