Прокрутка текстовых полей

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

Имеется два вида прокрутки: вертикальная и горизонтальная. Осуществить вертикальную прокрутку можно следующими способами:

• перемещая курсор ввода вверх или вниз при помощи клавиш движения;

• зажав левую кнопку мыши и выведя указатель за ту границу поля, в сторону которой должна быть произведена прокрутка;

• нажимая клавиши и (можно сместиться в самое начало и в самый конец документа);

• при помощи колеса мыши. В отличие от предыдущих версий Flash, во Flash MX 2004 такая возможность, наконец, появилась. Запомните следующие ее особенности;

o Чтобы поле начало прокручиваться, его совсем необязательно помещать в фокус щелчком мыши. Если указатель располагается непосредственно над полем, при повороте колеса фокус передастся полю автоматически. Па-оборот, если указатель находится не над полем, то оно не будет прокручиваться, даже если на нем находится фокус.

o Один такт движения колеса мыши прокручивает от 1 до 3 строчек кода.


Количество прокручиваемых строчек определяется соответствующей настройкой операционной системы, и оно одинаково для всех приложений. Изменить его средствами ActionScript невозможно. Правда, если колесо повернуть очень быстро, то два такта зачтутся за один — и одновременно будет прокручено в два раза больше строчек, чем принято по умолчанию.

o Иногда возможность прокрутки текстовых полей колесом мыши бывает необходимо отключать (например, созданная вами полоса прокрутки ее не предусматривает или вы хотите реализовать механизм, осуществляющий при повороте колеса мыши не вертикальную, а горизонтальную прокрутку). Решить эту задачу позволяет свойство mouseWheelEnabled, принимающее булево значение: true — поле прокручивается, false — нет. По умолчанию все поля являются прокручиваемыми,
Очевидно, что имеющиеся изначально способы прокрутки текстового поля на практике не всегда удобны. Так, если проект будет содержать большие текстовые фрагменты, для полей принято создавать полосы прокрутки, аналогичные соответствующим элементам Windows-приложений. Чтобы это было возможно, в ActionScript существуют инструменты, позволяющие задавать часть текста, которая будет отображаться.


По своей принадлежности они являются свойствами класса TextField. За вертикальную прокрутку отвечают три из них: scroll, maxscroll, bottomScroll. Так как данные свойства довольно просты, ограничимся их кратким описанием:

• scroll. Это свойство задает номер строки, которая будет отображаться в текстовом поле первой.

Отсчет строк ведется с 1. Чтобы прокрутить поле, достаточно присвоить свойству scroll новое значение. Прокручиваться поле будет лишь до тех пор, пока не отобразится самая нижняя или самая верхняя строчка. Присвоение scroll очень большого или, наоборот, отрицательного значения не даст эффекта прокрутки вхолостую.

• bottomScroll. Свойство, полностью аналогичное scroll, но возвращающее номер не первой отображенной строки, а последней. Строки, расположенные между строками с индексами scroll и bottomScroll. являются видимыми.

• maxscroll. Это свойство хранит максимальное допустимое для свойства scroll значение. Проще говоря, maxscroll показывает, как много строк потенциально может быть прокручено. Его величина вычисляется как общее число строчек поля минус количество линий, которые могут быть одновременно отображены, плюс один (так как отсчет линий ведется с 1).

Простейшим примером программной прокрутки является поле, проматываемое при помощи двух кнопок.


Первая (назовем ее down) поднимает текст на строку вверх. Вторая (пусть она называется up) опускает текст на линию вниз. Достигается это при помощи следующего кода:

up.onPress = function():Void {
if (pole.scroll>1) {
pole.scroll -= 1;
}
};
down.onPress = function():Void {
if (pole.scroll pole.scroll += 1;
}
};

Если не включен режим переносов, то текст вполне может выходить за пределы поля и по горизонта™. Просмотреть его можно, прокрутив поле в соответствующем направлении. Делается это точно так же, как и в случае вертикальной прокрутки (кроме, естественно, прокрутки колесом мыши).

Программно задавать горизонтальную прокрутку позволяют свойства hscroll и maxhscroll класса TextField:

• hscroll. Свойство определяет, на каком расстоянии от начала текста его пересечет левая граница поля. Единица измерения — пиксели. По умолчанию значение hscroll равно 0 — левые границы поля и текста совпадают.

Чтобы прокрутить поле по горизонтали, hscroll нужно присвоить новое значение. Причем оно может быть только целым числом, большим или равным 1. Присвоение hscroll отрицательного или очень большого значения не будет сопровождаться прокруткой вхолостую. Дробные величины автоматически округлятся до целых (поэтому к значению hscroll нельзя прибавлять числа, меньшие 0,5, — округление превратит их в 0).

• maxhscroll. Свойство хранит максимальное допустимое значение для hscroll,

В качестве примера приведем код, осуществляющий горизонтальную прокрутку текстового поля при повороте колеса мыши:

this.createTextField("pole", 0, 150, 150, 80, 30);
pole.border = true;
pole.text="

Горизонтальная прокрутка при помощи колеса мыши — это довольно оригинальный эффект";

Mouse.addListener(pole);
// При событии поворота колеса мыши проверяем, находится ли поле в фокусе.
// Если да, то прокручиваем его вправо, если колесо вращалось вверх,
// и влево, если поворот был осуществлен вниз.
pole.onMouseWheel = function(scr:Number):Void {
if (Selection.getFocus() == "_ievel0.pole") {
if (pole.hsсroll0) {
pole.hscroll += 5*scr;
return;
}
if (pole.hscroll>0 && scr<0) {
pole.hscroll += 5*scr;
}
}
};

Свойства scroll и maxscroll появились еще во Flash 5. Тогда текстовые поля не были именуемыми объектами, поэтому данные свойства применялись по отношению к переменной поля. Это довольно необычно (если не сказать — искусственно), так как формально переменная поля хранит объект данных элементарного типа. Пример:

// Создайте динамическое поле и свяжите его с переменной pole_var,
// Отобразите в поле достаточно большой многострочный текст pole_var=my_text;
this.onMouseDown=function():Void { // При щелчке мыши поле будет
// прокручиваться на строчку
pole_var.scroll+=1;
}

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

Реагировать на прокрутку поля можно благодаря наличию в ActionScript специального события onScroller, относящегося к классу TextField. Оно происходит при изменении области отображаемого текста вне зависимости оттого, прокручивается ли поле вручную или программно, горизонтально или вертикально. По умолчанию текстовые поля являются листенерами собственного события onScroller:

this.сreateTextField("pole", 0, 150, 150, 80, 30);
pole.border=true, pole.type="input", pole.text="Прокрутите текст";
pole.onScroller = function():Void {
trace("Произошла прокрутка!!!");
};

При желании листенером события onScrollor поля можно сделать любой объект. Для этого ссылка на него должна быть добавлена в массив, хранимый свойством _listeners поля. Сделать это можно при помощи метода addListener().

Основная задача это создание полос прокрутки. Однако во Flash MX 2004 вам совсем необязательно реализовывать их самостоятельно. Дело в том, что среди встроенных компонентов имеется поле с готовой полосой прокрутки — ScrollPane.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Автоматическое удаление пробелов. Свойство condenseWhite
Встраивание в фильм целого шрифта
Динамическая замена выделенного текста. Метод replaceSel()
Динамическое задание выделения. Метод setSelection()
Задание и извлечение текста поля

Вернуться в раздел: Action Script / 13. Работа с текстом