Перейти к содержанию
Fire Monkey от А до Я
  • 0

Изменение параметров анимации, определенной в стиле


Frol

Вопрос

Опубликовано (изменено)

Есть компонент, который отрисовываеься с помощью стиля. Для него в stylebook создана анимация. Как через код можно добраться до этой анимации и изменить ее параметры?

Если конкретнее, то речь идёт о чекбоксе и его прозрачности. По умолчанию в момент наведения мышки он должен загораться, а когда мышка уезжает - тухнуть. Но если галочка стоит, то должен гореть всегда (пока не не снимут).

Была идея по клику чекбокса изменить триггер анимации с движения мышки на что-то, что никогда не происходит, а по второму клику вернуть как было. Так вполне работает, если анимация и чекбокс созданы в момент дизайна и к анимации можно обратиться как к переменной.

В этом второй вопрос - как лучше отключить анимацию на время?

 

Вот тут описано решение

Только оно не работает. Может потому, что это 14 год, а может я как-то криво копирую, но FindStyleResource находит чекбокс в компоненте и не находит анимацию в чекбоксе.

Изменено пользователем Frol

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

  • 0
Опубликовано (изменено)

Какой StyleName у вашей анимации в стиле?
FindStyleResource, StylesData ищут именно по StyleName.

К тому же покажите код, как вы ищете анимацию.

 

И да, изменения, внесенные в компоненты стиля будут утрачены после перерисовки (а конкретно после вызова метода ApplyStyleLookup)

Изменено пользователем Dmitry_4501
  • 0
Опубликовано
Цитата

 

procedure TForm1.Button1Click(Sender: TObject);

  function AAA(Obj:TFmxObject; Name:string):TFmxObject;
  begin
    Memo1.Lines.Add('Ищется в '+Obj.ClassName+' объект стиля по имени '+Name);
    Result := Obj.FindStyleResource(Name);
    if (Result <> nil)
    then Memo1.Lines.Add('Найден объект типа '+Result.ClassName)
    else Memo1.Lines.Add('Не найден объект по имени'+' - '+Name);
    Memo1.Lines.Add('-');
  end;


var
  StyleObject: TFmxObject;
begin
  Memo1.Lines.Clear;
  StyleObject:=TreeView1.Items[0]; //искать в самом верхнем узле
  //StyleObject:=CheckBox1;
  StyleObject:=AAA(StyleObject,'Lock'); //искать в StyleObject то, чей стиль называется Lock - чекбокс
  if StyleObject=Nil then Exit;
  StyleObject:=AAA(StyleObject,'FloatAnimation1Style'); //искать в StyleObject то, чей стиль называется FloatAnimation1Style - анимация
end;

 

Вот сама процедура теста. А вот то, что оказывается в Memo
 

Цитата

Ищется в TTreeViewItem объект стиля по имени Lock
Найден объект типа TCheckBox
-
Ищется в TCheckBox объект стиля по имени FloatAnimation1Style
Не найден объект по имени - FloatAnimation1Style
-

 

 

13 часов назад, Dmitry_4501 сказал:

Какой StyleName у вашей анимации в стиле?

FloatAnimation1Style - присвоено автоматически в момент создания

  • 0
Опубликовано
7 часов назад, Frol сказал:

Найден объект типа TCheckBox
-

Как-то в приведённом вами примере отличается от вашего результата .

Цитата

Ищется в TTreeViewItem объект стиля по имени Lock
Не найден объект по имени - Lock
-

 

  • 0
Опубликовано
5 часов назад, GASCHE сказал:

Как-то в приведённом вами примере отличается от вашего результата .

 

Не понял того, что вы пишите. У вас там цитата, но цитата не точная. "Не найден объект по имени - Lock" находится на этой странице только один раз в вашем ответе (теперь будет находиться дважды)

там возможно немного сумбурно написано. все же это какой-то тест просто. Ищется TFmxObject по имени стиля и если находится, то выводится его тип.
По имени стиля Lock находится TCheckBox. TCheckBox со StyleName='Lock'.

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

 

Но теперь, я надеюсь, что пойму, что делал не так. Спасибо Дмитрию )

  • 0
Опубликовано (изменено)
11 часов назад, Frol сказал:

да. такое. Чудо какое-то )

Я такое поведение реализовал с одними лишь стилями, код вообще не писал.
А вот при помощи кода решил другой ваш вопрос (про AlternatingRowBackground)

 

FMXProject.zip

Изменено пользователем Dmitry_4501
Обновил FMXProject
  • 0
Опубликовано

Очень изящное решение, мне кажется. Не думал, что так можно. На чекбокс стоит тригер на анимацию

Цитата

 IsChecked=false;IsMouseOver=true

и на обратную анимацию 

Цитата

IsChecked=false;IsMouseOver=false

В результате анимация не срабатывает когда чекбокс с галочкой.

 

Это не снимает вопрос как найти анимацию как объект стиля, но теперь и не надо ))) нужный эффект получен. Спасибо Dmitry_4501

  • 0
Опубликовано (изменено)
Цитата

Это не снимает вопрос как найти анимацию как объект стиля

Допустим, на форме есть кнопка со своим стилем, её стиль выглядит допустим так, и надо найти opacityanimation.
image.png.8ab0dc2406936ddac4426c7f847e1a1e.png

Искать надо не от sublayout_6, а от самой кнопки, т.е:

image.png.d2e501d112aa1abda0901f063cc02b21.png

Если функция находит нужный объект стиля и возвращает true, то тогда можем работать с переменной _opacityAnimation, ведь в неё придет ссылка на объект анимации из стиля.
Всё просто.

Но кстати, можно работать и другим способом.

image.png.a3d11a1088758bcd22f372ba05b317df.png

Если нужно обратиться к одному или нескольким свойствам какого-то объекта внутри стиля то можно использовать первый способ (желтый)

А если нужно получить объект, то есть второй способ (зеленый). В принципе логика можно сказать такая же что и в самом первом способе через FindStyleResource

 

Полезная особенность StylesData. Его можно использовать для хранения любых пользовательских данных. 

Изменено пользователем Dmitry_4501
  • 0
Опубликовано (изменено)
10 часов назад, Dmitry_4501 сказал:

Искать надо не от sublayout_6, а от самой кнопки

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

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

10 часов назад, Dmitry_4501 сказал:

Полезная особенность StylesData. Его можно использовать для хранения любых пользовательских данных. 

Можете пояснить эту мысль? "любые пользовательские данные" очень нужно хранить )) как может пригодиться StylesData?

Изменено пользователем Frol
  • 0
Опубликовано
16 часов назад, Frol сказал:

IsChecked=false;IsMouseOver=true

Есть ли какая-то фича типа прижатого шифта, чтобы выбирать сразу несколько вариантов? или это просто руками вписывается?

  • 0
Опубликовано
22 часа назад, Frol сказал:

Можете пояснить эту мысль? "любые пользовательские данные" очень нужно хранить )) как может пригодиться StylesData?

По сути, StylesData обращается к полю типа TDictionary<string, TValue>, и позволяет хранить там свои данные.

Можно написать что-то вроде

// Запись значений
TreeViewItem.StylesData['custom.isLocked'] := true;
TreeViewItem.StylesData['custom.id'] := 'id';
TreeViewItem.StylesData['custom.groupId'] := 1234;

// Получение значений
var isLocked: Boolean := TreeViewItem.StylesData['custom.isLocked'].AsBoolean();
var id: string := TreeViewItem.StylesData['custom.id'].AsString();
var groupId: Integer := TreeViewItem.StylesData['custom.groupId'].AsInteger();

И т.д. Разумеется custom не является обязательным, можно использовать любое.

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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