Перейти к содержанию
  • Регистрация
  • 0
Garrincha

Частота отображения анимации

Вопрос

Доброго времени суток.

Требовалось в мой проект добавить немного анимации чтобы пользователи не скучали. По такому случаю решил использовать TFloatAnimation FireMonkey т.к. все говорили что это просто и очень красиво получается. Но возникла проблема с количеством кадров в секунду.

Приведу конкретный пример.

Нужно на OnMouseEnter чтобы кнопка увеличивалась по высоте в 2 раза (с 25 до 50). Так вот, если на свойство Height повесить TFloatAnimation то за 0,5 секунды картинка обновится

на компе Celeron 2,2GHz 2Гб ОЗУ всего 2-3 раза 

на компе Intel i3 2,53Ghz 4 Гб ОЗУ быстрее где-то раза в 3, но все равно не так плавно как хотелось бы.

Но если я по-старинке напишу такой код на OnMouseEnter

while but.Height < 50 do begin
    but.Height := but.Height + 1;
    Application.ProcessMessages;
    sleep(5);
  end;

И аналогичное на OnMouseLeave то даже на первом менее мощном компьютере все очень быстро и красиво отрабатывает. Просто супер как отрабатывает.

Это нормально для FireMonkey? Неужели все программируют под хорошие, относительно мощные компьютеры, а на старом железе нормальную анимацию на FireMonkey не написать?

Все видео что я видел в интернете про анимацию в FireMonkey отличное, анимация правда хорошая. Это меня удивляет.

Нигде не нашел информацию о том на какою дельту изменяется свойство объекта в TFloatAnimation и как определяется задержка между кадрами. Может при установке RAD?

Может кто-то сталкивался и такой проблемой и решил ее?

 

Заранее благодарен.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

на сколько я понял: анимация тормозит только первый раз. потом работает плавно. и на телефонах, и на десктопах

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

А что при этом показано на экране? Некоторые эффекты в FM ОЧЕНЬ СИЛЬНО затормаживают отрисовку. И это не только с анимацией. К примеру, у меня таймер, показывающий сотые доли секунды плавно и четко, еле показывал десятые доли при наложении на него эффекта тени или свечения и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

"при наложении на него эффекта тени или свечения и т.п. "

на НЕГО это на кого ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Простите, не совсем ясно выразился. Имеется в виду Label на весь экран, на котором отсчитываются минуты, секунды и сотые доли секунд. При наложении на лейбл эффекта начинались тормоза

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Добрый день,

  1. Вы можете поменять частоту срабатывания анимации. TAnimation.AniFrameRate отвечает за указания своей частоты срабатывания анимации. По умолчанию она равна 60 кадров в секунду. Значащие значения в диапазоне [5, 100]. Значения больше или меньше этого диапазона приводятся к нему же.
  2. Эффекты дорогостоящие операции. Поэтому их использование должно быть сведено к необходимому минимуму, особенно в анимации. В FireMonkey для ускорения эффектов, эффекты кешируются в контроле, к которому применяются. Однако, кэш не работает для анимации эффектов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От TTTimon
      В проекте несколько форм: есть главная (меню) + ИСТОРИЯ (достаточно тяжелая форма) + другие
      Задача:
      по нажатию в МЕНЮ на кнопку, начинается создание ИСТОРИИ и в это время проигрывается FloatAnimation для вращения индикатора (это круг с изображением).
      нужно по завершению создания формы прекратить анимацию и показать форму
       
      Как делаю:
      на главной форме есть F: TForm; при создании формы: F := nil; при нажатии на кнопку: 1) стартует анимация 2) F := TF_History.Create(nil); в процессе проверяю создание формы (если создалась, то стоп) procedure TF_Main.FloatAnimation1Process(Sender: TObject);
      begin
        if Assigned(F) then FloatAnimation1.Stop;
      end;
      в стопе показываю форму procedure TF_Main.FloatAnimation1Finish(Sender: TObject);
      begin
        F.Show;
      end;
       
      Ошибка: приложение вылетает с ошибкой "stack overflow"!
      P.S. Не совсем понимаю где копать, да и если у кого есть решение получше, буду только рад!)
    • От dammit
      Друзья, столкнулся  с проблемой, описанной в посте 
      Хочу предложить свое решение (может кому пригодится).
      Чтобы центр масштабирования был именно в центре объекта (в моем случае это TImage), необходимо после масштабирования установить свойство Align = TAlignLayout.Center, причем до этого нужно установить его в TAlignLayout.None !
      Примерно вот так:
        Image1.Scale.X:= 1.3;
        Image1.Scale.Y:= 1.3;
        Image1.Align:= TAlignLayout.None;
        Image1.Align:= TAlignLayout.Center;
      В этом случае будет эффект увеличения объекта из центра. Если убрать строчку "Image1.Align:= TAlignLayout.None;" - увеличение будет из левого верхнего угла. На мой взгляд некорректное поведение платформы. Возможно в будущих релизах это поправят.
      Embarcadero® Delphi 10.1 Berlin Update 2 Version 24.0.25048.9432  
    • От Вячеслав
      Всем добрый день. Как правильно переопределить родителя для аниматора и тем самым использовать один аниматор для нескольких объектов?
      Пытаюсь реализовать следующий принцип: на форме несколько прямоугольников и один аниматор. При клике по конкретному прямоугольнику он начинает менять координату. Вот чаcть кода:
      procedure TForm2.MoveRect(Rect: TRectangle); begin //задаем родителя для аниматора Rect.AddObject(AniMoveRect); //Анимируем координату Y прямоугольника AniMoveRect.PropertyName:='Position.Y'; AniMoveRect.Inverse:=False; AniMoveRect.StopValue:=0; AniMoveRect.Start; end; procedure TForm2.RectangleClick(Sender: TObject); begin MoveRect(Sender as TRectangle); end; В итоге анимируется только один прямоугольник - тот, на который кликнули в первый раз. Не могу понять, в чем проблема.
      Данную тему читал, но в ней, насколько я понял, речь идет об одновременном использовании аниматора для двух объектов. 
      AniRects.zip
    • От estra
      Редактирую стиль, добавляю к нему компонент TImage и для свойства RotateAngle создаю FloatAnimation (параметры анимации на скрине). Но при запуске никакой анимации нет. Почему? И как все же добиться работоспособности анимации для элемента стиля?
    • От Вячеслав
      Добрый день! Хочу заанимировать Lable таким образом, чтобы параметр Scale.X линейно увеличивался. Но при этом необходимо, чтобы центр компонента оставался на своем месте. А параметр Scale.X за начало отсчета принимает верхний левый угол лейбла. Есть ли возможность изменить центр масштабирования компонента? Я данную задачу уже решил путем добавления анимации смещения влево, но этот способ мне кажется топорным и неоптимальным.
    • От antarey
      Придумал как реализовать эфект Анимация смены TabItem в TabControl , но есть вопрос - можно ли для двух объектов использовать один TFloatAnimation? или реализовывать через TTimer?
    • От NesDmitrijj
      Здравствуйте!
       
      Как можно реализовать простой эффект плавного исчезновения текста (TLabel) с последующим его плавным появлением без глюков?
      Пример:
      Кидаю на форму Label Создаю FloatAnimation для свойства Opacity У FloatAnimation делаю StartValue = 1, StopValue = 0 Кидаю на форму кнопку и в OnClick пишу: FloatAnimation1.Start;
      Результат: При нажатии кнопки текст плавно исчезает и по завершению анимации текста не видно. У FloatAnimation делаю AutoReverse = true; Результат: При нажатии кнопки текст плавно исчезает, а затем плавно появляется. По завершению анимации текст виден. Но при повторном нажатии всё начинает глючить.
       
      Вопрос: как исправить?
    • От Egorius
      Как запустить анимацию с кнопки для другого компонента?

      К примеру с Button  кликом запустить анимация для вызова например анимированного объекта Panel?
    • От krapotkin
      TFloatAnimation использует ProcessMessages 
       
      Это чревато возникновением всяких событий, и даже закрытию формы во время анимации, что приводит к AV
      очень хочется иметь Repaint без ProcessMessages.
      Это возможно?
    • От 97mik
      Как сделать эффект вспышки? То есть чтобы например Panel переходила из Opasity=0 в Opasity=1 и потом обратно, за 500мс..
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...