Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Скролл TextField (http://www.flasher.ru/forum/showthread.php?t=124294)

willis83 26.04.2009 01:10

Скролл TextField
 
Есть текстовое поле, тип INPUT и про вводе текста большего чем сам TextField хотелось бы чтобы появлялся скролл по вертикали автоматически. При углублении в тему выход нашел через casheAsBitmap и rectangle, но может есть выход попроще?

Rzer 26.04.2009 01:23

textHeight*numLines = высота текстового поля для плавной прокрутки. Маска к тексту и скрол - всё, что тебе нужно. Или скролить тектовое поле через scrollV. Число строк которое мы видим = bottomScrollV - scrollV, сравнивая с количеством строк numLines можем также определить скролл.

willis83 26.04.2009 01:53

Вы меня не так поняли. Мы имеем поля для ввода текста определённого размера, пользователь вводит текст и объем текста не помещается в это поле, так вот я хотел чтобы когда верхние строки начнут уходить за поле, автоматически появлялся вертикальный скролинг. Подобие ScrollPane.

Rzer 26.04.2009 10:53

Цитата:

Или скролить тектовое поле через scrollV. Число строк которое мы видим = bottomScrollV - scrollV, сравнивая с количеством строк numLines можем также определить скролл.
Текстовое поле в этом случае имеет заданную высоту. Оба случая, описанные мною имеют поведение ScrollPane, сама по себе полоса прокрутки у поля не появится.

sabarn 27.04.2009 17:40

добавить компоненту UIScrollBar к текстовому полю
и описать его:
Код AS3:

myScroll.scrollTargetName = "myTextField";


Gal4enochek 15.05.2009 13:03

Столкнулась с похожей проблемой. Надо прицепить скроллбар к динамическому текстовому полю.
Прочитала тут и про UIScrollBar, решила попробовать, но не выходит.
Пишу на AS3. Компилирую через Flash CS3 , а код пишу во Flexe. Flex не видит библиотеки fl.controls.UIScrollBar.
Как быть? Может какую-то библиотеку подключить?

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

wvxvw 15.05.2009 13:40

Если есть Флеш - положите компонент скроллбара в отдельный файл, скомпилируйте его в SWC и подключите библиотеку к проекту.
Если Флеша нету, но вы пользуетесь Флексовым фреймворком - во Флексе есть свой скроллбар:
http://livedocs.adobe.com/flex/3/lan...ScrollBar.html
Если ни то и ни дрогое и у самой не получается написать:
http://code.google.com/p/e4xu/source...ui/Scroller.as
http://e4xu.googlecode.com/files/scrollertest.zip
можете взять за основу или прямо так и использовать.

Gal4enochek 15.05.2009 13:59

Спасибо.
Почти получилось написать свой скроллбар: устанавливаю text_field.scrollV в значение, которое соответствует текущему положения ползунка.
Правда в этом случае пришлось отказаться от скроллинга колесиком мыши. Либо колесиком текстовое поле само себя скролит (и скроллбар в соответствии двигает ползунок), либо если используется полоса скроллбар, то на колесико не реагируем.
Во что вышло (пока без кнопок, ползунок - тоже самостоятельно написанная кнопка)
Код AS3:

public class ScrollBar extends MovieClip
        {
                private var background                :MovieClip;
                private var slider                        :BasicButton;
                private var max_value                :Number;
                private var delta_y                        :Number = 10;
                private var anchor_y                :Number;
                private var vis_lines_count :int;
 
                private var        text_field                :TextField;
                private var enable_whell        :Boolean;       
 
                public function ScrollBar()
                {
                        super();
                        background = this.getChildByName("bg") as MovieClip;
                        max_value = background.height;
                        slider = new BasicButton(this.getChildByName("slider_mc") as MovieClip);
                        slider.addEventListener(MouseEvent.MOUSE_DOWN, sliderMouseDownHandler);
                        slider.addEventListener(MouseEvent.MOUSE_UP, sliderMouseUpHandler);
                        this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                        enable_whell = true;
                }
 
                public function attachTextField(textField :TextField):void{
                        text_field = textField;
                        text_field.addEventListener(Event.SCROLL, scrollTextHandler);
                        vis_lines_count = Math.floor(textField.height * textField.numLines / textField.textHeight);
                        scrollTextHandler(null);
                }
 
                private function sliderMouseDownHandler(event:MouseEvent):void{
                        startSlide();
                }
 
                private function sliderMouseUpHandler(event:MouseEvent):void{
                        stopSlide();
                }
 
                private function mouseOutHandler(event:MouseEvent):void{
                        stopSlide();
                }
 
                private function sliderMouseMoveHandler(event:MouseEvent):void{
                        slider.Clip.y = this.mouseY - anchor_y;
                        normalizePosition();       
                }
 
                private function enterFrameHandler(event :Event):void{
                        if (text_field && this.visible && !enable_whell){
                                var n:int = text_field.numLines;
                                var percent :Number = slider.Clip.y/(max_value - slider.Clip.height)
                                text_field.scrollV = Math.round(percent*(n-(vis_lines_count-1))) + 1;
                        }
                }
 
                private function scrollTextHandler(event :Event):void{
                        if (text_field && enable_whell){
                                var n:int = text_field.numLines;
                                var cur:int = text_field.bottomScrollV;
                                var percent :Number = (cur - vis_lines_count)/(n - vis_lines_count)
                                slider.Clip.y = (max_value - slider.Clip.height)*percent;
                                visible = (n >= vis_lines_count);
                        }
                }
 
                private function normalizePosition():void{
                        if (slider.Clip.y > max_value - slider.Clip.height)
                                slider.Clip.y = max_value - slider.Clip.height;
                        if (slider.Clip.y < 0)
                                slider.Clip.y = 0;
                }
 
                private function startSlide():void{
                        if (!this.hasEventListener(MouseEvent.MOUSE_OUT))
                                this.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);       
                        slider.Clip.startDrag(false, new Rectangle(0, 0, 0, max_value - slider.Clip.height));
                        enable_whell = false;
                }
 
                private function stopSlide():void{
                        if (this.hasEventListener(MouseEvent.MOUSE_OUT))       
                                this.removeEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);       
                        slider.Clip.stopDrag();
                        enable_whell = true;
                }
 
                private function slideDown():void{
                        slider.Clip.y += delta_y;
                        normalizePosition();
                }
 
                private function slideUp():void{
                        slider.Clip.y -= delta_y;
                        normalizePosition();
                }
 
                public function destoy():void{
                        slider.destroy();
                        try{slider.removeEventListener(MouseEvent.MOUSE_DOWN, sliderMouseDownHandler);}
                                catch(e:Error){};
                        try{slider.removeEventListener(MouseEvent.MOUSE_UP, sliderMouseUpHandler);}
                                catch(e:Error){};
                        try{this.removeEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);}
                                catch(e:Error){};       
                        try{this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);}
                                catch(e:Error){};       
                        if (text_field){       
                                try{text_field.removeEventListener(Event.SCROLL, scrollTextHandler);}
                                        catch(e:Error){};
                        }               
                }
 
        }


willis83 15.05.2009 17:12

А зачем лишняя работа если есть компонента TextArea? Вполне удобно. И скроллбар сама показывает и вид нормальный. Были проблемы со шрифтами, но я разобрался. на адобе дурацкий пример настройки выложили... как будто специально не хотят учить 8)

Gal4enochek 15.05.2009 17:28

Опять же Flex не знает, что такое fl.controls.TextArea :( То есть надо его как-то отдельно присоединять к проекту + скроллбар нужно скинить.
А так вышло неплохое упражнение по написанию собственных контролов :)


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

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