уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Если Вы хотя бы раз создавали в Delphi XE2 проект FireMonkey, то безусловно должны были оценить наличие большого количества эффектов и различных анимаций с помощью которых можно создать визуально привлекательные приложений. Всего в FireMonkey насчитывается свыше 50 различных визуальных эффектов, которые условно можно разделить на несколько категорий: одни эффекты преобразуют каждый пиксель изображения в отдельности, например, меняют контрастность, другие, такие как эффект Blur, работают с областями пикселей, третьи — реализуют плавный переход одного изображения в другое. Чаще всего, для того, чтобы применить какой либо визуальный эффект к элементы на форме его достаточно просто бросить на этот элемент и выставить необходимые настройки в Object Inspector. Например, на рисунке ниже представлен компонент TText с наложенным на него эффектом TReflectionEffect:

Естественно, мы вправе применить к этому эффекту анимацию, какого-либо его свойства, например, сделать так, чтобы по какому-либо событию отражение плавно вытягивалось или, наоборот сжималось. Делается это, в принципе, достаточно элементарно. Достаточно написать, что-то типа такого кода:

procedure TForm25.Text1MouseEnter(Sender: TObject);
begin
 ReflectionEffect.AnimateFloat('Length',0.7,0.5);
end;
 
procedure TForm25.Text1MouseLeave(Sender: TObject);
begin
 ReflectionEffect.AnimateFloat('Length',0.35,0.5);
end;

И в итоге мы получим вот такой визуальный эффект для текста на форме:

[youtube_sc url=»EhO-_a8DSC0″]

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

Более интересными в FireMonkey выглядят эффекты перехода. Такие эффекты, помимо того, что содержат в названии подстроку «Transition» также отличаются от всех прочих компонентов для эффектов наличием свойства Progress, которое используется для управления эффектом.

Для примера рассмотрим использование эффект перехода для двух изображений. Создадим новый проект FireMonkey HD Application, бросим на главную форму приложения компонент TImage и загрузим в него, какую-нибудь картинку:

Теперь бросим на TImage какой-нибудь эффект перехода, например, BloodTransitionEffect. По умолчанию для эффекта перехода установлено свойство Progress=30, меняем его на 0.

Теперь в свойство Target эффекта загружаем какую-нибудь другую картинку, например, такую:

И, как и в предыдущем примере для TReflectionEffect, воспользуемся анимацией, но только для свойства Progress:

procedure TForm25.Image1MouseEnter(Sender: TObject);
begin
  BloodTransitionEffect1.AnimateFloat('Progress',100,0.5);
end;
 
procedure TForm25.Image1MouseLeave(Sender: TObject);
begin
  BloodTransitionEffect1.AnimateFloat('Progress',0,0.5);
end;

В итоге у нас получится вот такой интересный эффект перехода одного изображения в другое:

[youtube_sc url=»SXrcXn-hblE»]

К сожалению, на видео не видно всей плавности перехода, несмотря на то, что видео снималось на максимальных настройках. Но тем не менее, можно увидеть сам переход.

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

Чтобы продемонстрировать это на примере, сделаем так, что обычный список TListBox будет превращаться в TStringGrid (прям как в кино — «Брюки превращаются…в элегантные шорты»(с)). Бросим на форму компоненты TListBox и TStringGrid, TButton, а также эффект перехода, скажем, WiggleTransitionEffect. В ListBox добавим несколько элементов (чисто для примера). Теперь на OnClick кнопки напишем такой обработчик:

type
  TForm25 = class(TForm)
    [....]
  private
    GridShowing: boolean;
  public
    { Public declarations }
  end;
 
var
  Form25: TForm25;
 
implementation
 
{$R *.fmx}
 
procedure TForm25.Button1Click(Sender: TObject);
var Target: TBitmap;
begin
  WiggleTransitionEffect1.Progress:=0;
  if GridShowing then
    begin
      Target:=StringGrid1.MakeScreenshot;
      WiggleTransitionEffect1.Parent:=StringGrid1;
    end
  else
    begin
      Target:=ListBox1.MakeScreenshot;
      WiggleTransitionEffect1.Parent:=ListBox1;
    end;
  WiggleTransitionEffect1.Target:=Target;
  WiggleTransitionEffect1.AnimateFloatWait('Progress',100,0.4);
  if GridShowing then
    ListBox1.BringToFront
  else
    StringGrid1.BringToFront;
  GridShowing:=not GridShowing;
  if Assigned(Target) then
    Target.Free;
end;

Результатом будет следующее «превращение» списка в таблицу и обратно:

[youtube_sc url=»fkQL4ZaRgt4″]

К сожалению, опять же ролик не совсем точно и качественно передает всю красоту этого визуального эффекта, так что можете повторить его в своем приложении и глянуть на результат.

Собственно, в приведенном выше коде мы сделали следующее: в зависимости от того какой элемент формы в данный момент видит пользователь сняли скриншот этого контрола, используя его метод MakeScreenshot  и передали в Target эффекта. После чего прокрутили анимацию от 0 до 100 и подняли на верх необходимый нам контрол. Ну, а так как мы делаем переход от контрола к контролу, используя битмап, то анимацию проигрываем через метод AnimateFloatWait, т.е. ждем пока анимация дойдет до конца и после этого продолжаем код и, таким образом, создаем полную видимость «превращения».

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

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
10 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
teran
11/02/2012 03:23

хех (: с превращением грида в список забавно (:
а для простых эффектов можно и без обработчиков движений мыши обойтись, там ведь есть у самих эффектов trigger, где можно поставить mouseenter и инверсию при выходе мыши. hittest только нужен компоненту.

Алексей
Алексей
12/02/2012 17:56

Интересно! =)

Vlad, пиши больше и чаще!  

Bogdan
Bogdan
18/02/2012 12:20

Сразу сорь за оффтоп. У меня уже скоро войдёт в привычку, но всёже — вот тема для нового поста http://www.raudus.com/. Наткнулся вчера. Всю ночь за ним провёл. Данное приложение — framework. Распространяется freeware. Устанавливается на Delphi 7 — XE2 и в данный момент активно развивается. Чем-то схожи с IntraWEB (хотя нет, только идеей). Вообщем, framework создаёт новый тип приложения — Raudus Application, которое позволяет создавать ПРОДВИНУТЫЕ WEB ПРИЛОЖЕНИЯ для PC и мобильных устройств. Можно даже компилить под Android нативное приложение)), под Palm и другие.. Настоятельно прошу обозреть))) Конкретно, создание — ерунда, больше интиресует публикация на сайте и компиляция под Android… Подробнее »

Сергей Румянцев

Bogdan, я лично натыкался на это творение где-то в декабре и отказался по идейным причинам, более подробно описал тут http://www.night-fox.ru/2012/01/11/universal_language_for_all_os_1/

Bogdan
Bogdan
18/02/2012 14:54

Ну да, безусловно «много» написано)

samsim
26/03/2012 02:52

Хотя ролик не отображает настоящего эффекта, но в принципе пример ясен.

Игорь Валентинов

Здравствуйте!

Опишите пожалуйста как сделать обычную слайд фотогалерею для iphone?