Перейти к содержанию
  • 0
estra

Как применить анимацию к элементу стиля?

Вопросы

6197151.jpg

 

Редактирую стиль, добавляю к нему компонент TImage и для свойства RotateAngle создаю FloatAnimation (параметры анимации на скрине). Но при запуске никакой анимации нет. Почему? И как все же добиться работоспособности анимации для элемента стиля?

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


Ссылка на сообщение

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

  • 0

Вроде как анимацию нужно стартовать, либо в коде, либо по триггеру. Правда не знаю как с этим обстоят дела в стилях.

 

Возможно, позже получится посмотреть.

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


Ссылка на сообщение
  • 0

Если установить Endbled = True, она и так стартует.

А как добраться до анимации в стиле, чтобы запустить ее из кода?

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


Ссылка на сообщение
  • 0

Проверил на Label и свойстве Opacity.

У меня анимация срабатывает сразу, в design-time, без всяких галочек, просто положил на стиль лейбла и всё.

Как получить доступ из кода:

procedure TForm1.Button1Click(Sender: TObject);
var
  StyleObject: TFmxObject;
  StyleAni: TFloatAnimation;
begin
  StyleObject := Label1.FindStyleResource('floatanimationstyle');
  if (StyleObject <> nil) and (StyleObject is TFloatAnimation) then
  begin
    StyleAni := TFloatAnimation(StyleObject);
    StyleAni.Duration := 0.9;
    StyleAni.StartValue := 0;
    StyleAni.StopValue := 1;
    StyleAni.Start;
  end;
end;

Проверил, данный код работает.

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


Ссылка на сообщение
  • 0

Спасибо, в конечном счете заработало, но не сразу и как то странно. Сначала положил на форму Label, сделал необходимые манипуляции и все заработало. Затем положил CornerButton, повторил манипуляции, но анимация упорно не работала. Затем положил Button, все повторил, и с кнопкой анимация заработала. Вернулся к CornerButton, и с ней все заработало. Странно это как то...

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


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.

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

    • От 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  
    • От Error
      ЧАВО:
      Опишу "багофичу" на которую я наткнулся.
      Предположим что вы пишете свой компонент, наследуемый от TStyledControl (или любого другого компонента, который происходит от  TStyledControl), для доступа к элементам стиля обычно используют FindStyleResource('ИмяРесурса') (есть вариант в виде FindStyleResource<Класс>('ИмяРесурса', Переменная)) , например компонент TImageControl получает Image так:
      procedure TImageControl.ApplyStyle; begin inherited; if FindStyleResource<TImage>('image', FImage) then UpdateImage; end; И FindStyleResource работает отлично, пока в дереве стиля искомый объект лежит на НЕ TStyledControl-ах, то есть FindStyleResource будет успешно находить объект, который расположен на TRectangle, но не найдет его же, но на TPanel!
      Пример:
      Код, в процедуре ApplyStyle:
      procedure TEsImageSelection.ApplyStyle; var T: TControl; begin inherited ApplyStyle; if FindStyleResource<TControl>('selection', T) then ShowMessage('"selection" founded!'); end; Что делает данный код? - При нахождении стилевого объекта выдает соответствующее сообщение.
      Рассмотрим стиль:

      Как видите в варианте A, "Selection" лежит на НЕ наследнике TStyledControl. Запустив программу можно убедиться что FindStyleResource<TControl>('selection', T) найдет объект "Selection".
      В варианте B, при запуске можно с удивлением обнаружить что FindStyleResource<TControl>('selection', T) не находит объект "Selection"!
      Почему так?
      Судя по исходникам поиск во вложенных TStyledControl-ах сломан специально, дабы не всплывали еще большие глюки\проблемы.(но я не изучал вопрос очень подробно, во внутренний код работы с загрузкой и поиском стилей - кромешный ад, с наслаиванием истории Fire-Monkey разных лет).
      Как можно обойти проблему?
      Я нашел следующее решение:
      (Однако я совершенно не уверен в отсутствии побочных эффектов, возможно @Brovin Yaroslav сможет прокомментировать его?)
      Данный код находит искомый стилевой объект, в отличии от FindStyleResource.
      procedure TEsImageSelection.ApplyStyle; var T: TControl; begin inherited ApplyStyle; T := nil; EnumObjects( function (Obj: TFmxObject): TEnumProcResult begin if Obj.StyleName.ToLower = 'selection' then begin T := TControl(Obj); Result := TEnumProcResult.Stop; end else Result := TEnumProcResult.Continue; end); if T <> nil then ShowMessage('"selection" founded!'); end;  
      Процедура-замена FindStyleResource, работает как ожидается:
      type TOpenStyledControl = class(TStyledControl); function EsFindStyleResource(Self: TStyledControl; StyleName: string): TFmxObject; var StyleObject: TFmxObject; begin // если Self.ChildrenCount < 1 то в компоненте не загружен стиль, // т.к. известно что главный эллемент стиля ВСЕГДА находиться по нулевому индексу. if (TOpenStyledControl(Self).ResourceLink = nil) or (Self.ChildrenCount < 1) then Exit(nil); StyleObject := nil; Self.Children[0].EnumObjects( function (Obj: TFmxObject): TEnumProcResult begin if Obj.StyleName.ToLower = StyleName.ToLower then begin Result := TEnumProcResult.Stop; StyleObject := Obj; end else Result := TEnumProcResult.Continue; end); Result := StyleObject; end;  
    • От trl
      Не нашел ответа на форуме.  не могу понять почему FindStyleResource  не возвращает объекта.
      procedure TMainForm.Button1Click(Sender: TObject); var item :  TListBoxItem;       lbName:TLabel; begin     Item := TListBoxItem.Create(Self);     Item.Parent := ListBox;      Item.StyleLookup := 'lyItemBoxDetail';        lbName := Self.FindStyleResource('lbname') as TLabel; // Здесь получаю nil     ShowMessage(  Item.StylesData['lbname.Text'].AsString) // А этот код работает end;  
    • От max7ka
      Подскажите где можно найти структуру StyleLookup для объектов, чтобы можно было использовать в FindStyleResource?
       
      Например
       
       CheckBox
          checkboxunchecked
          checkboxchecked
          checkmark
          ...
       
       TGrid
         header
         focus
         selection
         ...
    • От Ra72
      Создал компонент:
      type TTube = class(TFmxObject) private FTheColor: TAlphaColor; public constructor Create(AOwner: TComponent); override; published property TheColor: TAlphaColor read FTheColor write FTheColor; end; constructor TTube.Create(AOwner: TComponent); begin inherited; FTheColor := $FFFFFFFF; end; Вставил его в StyleBook.
      object TTube StyleName = 'tube1' TheColor = claViolet end Ищу его в стилизованном контроле:
       
      var tube: TTube; begin tube := ATarget.FindStyleResource('tube1') as TTube; Не находится компонент. 
      Стандартные Text, Rectangle... находятся таким способом, а свой - нет.
      Что я делаю не так?
    • От Вячеслав
      Всем добрый день. Как правильно переопределить родителя для аниматора и тем самым использовать один аниматор для нескольких объектов?
      Пытаюсь реализовать следующий принцип: на форме несколько прямоугольников и один аниматор. При клике по конкретному прямоугольнику он начинает менять координату. Вот ча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
    • От 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?
      Может кто-то сталкивался и такой проблемой и решил ее?
       
      Заранее благодарен.
       
    • От estra
      Почему метод FindStyleResource  в OnCreate и OnShow формы возвращает nil, а после запуска программы (в Button1.OnClick) возвращает указатель на объект? Как получить доступ к объекту стиля в момент запуска программы?
    • От Вячеслав
      Добрый день! Хочу заанимировать Lable таким образом, чтобы параметр Scale.X линейно увеличивался. Но при этом необходимо, чтобы центр компонента оставался на своем месте. А параметр Scale.X за начало отсчета принимает верхний левый угол лейбла. Есть ли возможность изменить центр масштабирования компонента? Я данную задачу уже решил путем добавления анимации смещения влево, но этот способ мне кажется топорным и неоптимальным.
  • Последние посетители   0 пользователей онлайн

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

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