JavaFX в действии

Разбираемся с эффектами

Сегодня мы с вами продолжим (и, я надеюсь, уже и закончим) разбираться с эффектами, которые предлагает разработчику RIA-приложений платформа JavaFX. Большую часть из этих эффектов мы уже рассмотрели в предшествующих статьях, сегодня разберёмся с тем, что осталось.

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


Смешение

Иногда так бывает, что оказывается нужным "смешать" два изображения в одно. И в арсенале платформы JavaFX, конечно же, есть эффект, который позволит вам без особых проблем это сделать - думаю, вы и не сомневались в том, что так в итоге и окажется. Называется эффект, отвечающий за смешение изображений, Blend - если вы знаете английский, вас это название наверняка ничуть не удивило.

 

Что ж, давайте вместе посмотрим на то, какие у этого интересного эффекта параметры. Вместо одного стандартного параметра input, к которому вы уже наверняка привыкли благодаря предыдущим рассмотренным эффектам, здесь целых два таких параметра: bottomInput и topInput. Таким образом, как видите, у нас одно изображение накладывается сверху на другое - то, которое служит topInput'ом, будет сверху, а второе, соответственно, снизу.

Следующий важный параметр - mode. Он имеет тип BlendMode, и именно он определяет, как именно будут смешиваться два изображения. К сожалению, различных вариантов значений у этого типа достаточно много, а поэтому рассказать о каждом из них в рамках данной статьи не представляется возможным - вам придётся воспользоваться документацией из JavaFX SDK. Тем не менее, я приведу здесь список возможных значений этого параметра эффекта Blend: ADD, BLUE, COLOR_BURN, COLOR_DODGE, DARKEN, DIFFERENCE, EXCLUSION, GREEN, HARD_LIGHT, LIGHTEN, MULTIPLY, OVERLAY, RED, SCREEN, SOFT_LIGHT, SRC_ATOP, SRC_IN, SRC_OUT, SRC_OVER.

Наконец, последний по счёту параметр эффекта Blend, оставшийся до сих пор нами нерассмотренным, называется opacity - он определяет степень прозрачности (или, вернее, непрозрачности) верхнего input'а ещё до смешения. Изменяется этот параметр, как вы наверняка уже догадались, от нуля до единицы, а значением по умолчанию для него является именно единица.


Зальёмся!

Нет-нет, сейчас не про алкоголь и не про вред от него. Сейчас мы поговорим о том, как сделать определённую заливку заданного экранного региона. Было бы наивным предполагать, что в JavaFX это будет сложно сделать - ведь здесь есть эффект Flood, который помогает нафлудить с пользой.

Итак, какие у этого эффекта есть параметры? Первый - height, задающий высоту прямоугольной области, которую мы будем заливать. Да-да, область будет именно прямоугольной, и, конечно, это в некотором роде минус, но с этим нужно смириться. По умолчанию этот параметр равен 0.0, поэтому нужно что-то делать с ним, если вы хотите, чтобы залитый вами прямоугольник был виден на экране. Второй по счёту параметр - это paint, который задаёт способ заливки вашего прямоугольника. Здесь вы можете задать сплошной цвет, градиент и т.д., и т.п. По умолчанию цвет задан сплошной, причём красный. Следующий параметр - width. Это, как несложно догадаться, ширина заливаемого красным (или не красным) цветом прямоугольника. По умолчанию ширина, как и высота, задана равной нулю. Оставшиеся нерассмотренными два параметра этого эффекта называются x и y, и задают, соответственно, горизонтальную и вертикальную координаты в системе координат того объекта, на котором вам нужно построить закрашенный прямоугольник. По умолчанию и x, и y равны нулю.

Возможно, этот эффект показался вам скучным, но он бывает очень даже полезен в тех случаях, когда вам нужно закрасить какую-либо область на поверхности какого-либо объекта, а потому о нём стоит помнить в повседневной практике написания JavaFX-приложений.


Идентичность

Именно таким образом можно перевести название следующего эффекта, о котором мы будем вести речь. Наверное, эффект Identity - это самый необычный из тех эффектов, о которых мы с вами говорили вообще и в этой части статьи о JavaFX, в частности. В чём заключается действие этого эффекта на изображение? Ни в чём - вот правильный ответ. Этот эффект оставляет объект, к которому вы его применяете, совершенно неизменным. Для чего же он тогда нужен? Что ж, вопрос вполне закономерный, однако ответ на него предельно прост. Помните параметр input, присутствующий у эффектов для создания цепочки эффектов над одним объектом? Для участия в такой цепочке вам частенько нужно будет использовать эффект Identity.

Что касается параметров, то их у этого эффекта целых три (казалось бы, у эффекта, который ничего не делает с изображением, должен быть только один параметр, но у создателей платформы JavaFX несколько иное видение этого вопроса). Поэтому первый по счёту параметр имеет название source и тип Image. Ещё два параметра, x и y, равные по умолчанию нулю, которые позволяют выделить определённую область, над которой будет действовать данный эффект.


Инверсная маска

Эффект InverseMask позволяет вам получить маску данного объекта, то есть те области, которые будут прозрачными у объекта, будут непрозрачны у маски, и наоборот, в областях непрозрачности объекта будут области прозрачности маски.

Параметров у этого эффекта совсем немного, всего два. Первый - классический input, второй - pad, определяющий размер кромки, добавляемой к каждому краю результирующего изображения. Как видите, параметров совсем немного, и запутаться в них будет достаточно сложно.


Да будет свет!

Следующий по счёту эффект, который нам предстоит рассмотреть, - это Lighting. Название у него, как, впрочем, и у всех остальных JavaFX-эффектов, действительно "говорящее". Этот эффект позволяет придать изображению более реалистичный, практически "трёхмерный" вид благодаря эмуляции освещения его с помощью удалённого источника света. Этот эффект довольно зрелищен, а потому наверняка вы будете использовать его достаточно часто для придания более привлекательного внешнего вида интерфейсу вашего RIA-приложения.

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

Первый по счёту параметр называется bumpInput. Этот параметр задавать не обязательно, и по умолчанию он равен null. Он задаёт "карту" выпуклостей на изображении, которые и нужны для придания ему трёхмерности и реалистичности. Есть ещё один input'овый параметр - он называется contentInput, и задаёт, собственно, содержимое того, к чему будет в последующем применяться данный конкретный эффект. Следующий по счёту параметр называется diffuseConstant, т.е. диффузная константа - наверное, здесь даже не нужно добавлять какие-то пояснения. Изменяется diffuseConstant в пределах от единицы до двух.

Самый, пожалуй, важный параметр из всех, которые фигурируют в данном эффекте, - это light типа Light. Именно этот параметр задаёт источник света, который будет виртуально освещать выбранный вами объект. Класс Light - абстрактный, и на нём базируется несколько классов: javafx.scene.effect.light.SpotLight, javafx.scene.effect.light.DistantLight и javafx.scene.effect.light.PointLight. Первый задаёт точечный источник с изменяемыми направлением света и фокусом, второй - существенно удалённый от объекта источник света (то есть, нам, в общем-то, всё равно, точечный он или нет - так он далеко), а третий - просто равномерно светящую во все стороны точку. У каждого из этих классов есть свои параметры, однако здесь, опять-таки, не будет места, чтобы все их расписать, так что вам придётся обратиться к документации из JavaFX SDK.

Следующим по списку параметром идёт specularConstant - константа, характеризующая отражательные свойства "поверхности" нашего объекта и варьирующаяся в пределах от 0.0 до 2.0. Её значение по умолчанию равно 0.3. Ещё один похожий параметр - specularExponent, изменяющийся от 0.0 до 40.0 и по умолчанию равный 20.0. Есть ещё параметр surfaceScale (от 0.0 до 10.0, по умолчанию - 1.5), задающий масштабирующий фактор для поверхности. Описывать действие изменения значений каждого из этих параметров на бумаге достаточно сложно, поэтому гораздо лучше будет самостоятельно поэкспериментировать с ними, чтобы понять, как именно они действуют.


Резюме

Что ж, мы с вами сегодня рассмотрели ещё пять эффектов из богатой коллекции платформы JavaFX. Не хочу вас огорчать, но, тем не менее, это ещё не все эффекты, которые предоставили в наше с вами распоряжение разработчики из Sun Microsystems, так что продолжение будет.

Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by

Версия для печатиВерсия для печати

Номер: 

30 за 2009 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!