Почему FireMonkey TListBox Animation предотвращает отмену выбора элемента на платформе Windows32

Я новичок в FireMonkey (привлечена его новой способностью работать с Android). Я пытаюсь анимировать выбор элемента с анимацией списка, чтобы показать основное содержимое (частый шаблон). Однако у меня возникли проблемы с получением списка для управления отменой выбора ранее выбранного элемента, когда я анимирую исчезновение списка. Как ни странно, это происходит только на платформе Windows, а не на устройствах Android или iPad (или симуляторе iPad).

Чтобы воспроизвести проблему (в RAD Studio XE5):

1) Создайте новое мобильное приложение FireMonkey, выбрав Tablet Master-Detail для использования в качестве начального макета.

2) Щелкните правой кнопкой мыши Целевые платформы и выберите 32-разрядную версию Windows, чтобы упростить отладку, и выберите ее.

3) Добавьте новый объект TListBox и поместите его в левую часть окна.

4) Используйте браузер структуры, чтобы переместить его в LeftLayout, сделав его родительским для LeftLayout.

5) Нажмите на объект ListBox1

6) Измените свойство Align на alClient, чтобы заполнить LeftLayout

7) В ObjectInspector выберите свойство Position и вспомогательное свойство X, а затем выберите Create New TFloatAnimation. FloatAnimation будет называться FloatAnimation1.

8) Создайте новый обработчик OnItemClick для ListBox1 и добавьте следующий код:

FloatAnimation1.StartFromCurrent := True;
FloatAnimation1.StopValue :=  0 - ((LeftLayout.Width) / 1);
FloatAnimation1.Start;

9) Создайте новую кнопку и поместите ее на панель инструментов в верхней части левого окна.

10) Создайте обработчик для новой кнопки и добавьте следующий код:

FloatAnimation1.StartFromCurrent := True;
FloatAnimation1.StopValue := 0;
FloatAnimation1.Start;

11) Дважды щелкните элемент ListBox, чтобы открыть конструктор элементов, и трижды щелкните кнопку AddItem, чтобы добавить три элемента TListBoxItem.

12) Запустите приложение. Нажмите на один из трех элементов в ListBox. ListBox анимируется влево, вне поля зрения. Нажмите на кнопку, которую мы добавили, чтобы вернуть ее. Нажмите на другие элементы, и, в конце концов, у вас будут выбраны все три элемента, даже если MultiSelect отключен для ListBox1.

13) Остановите приложение. Измените код обработчика OnItemClick, изменив «1» на «2», чтобы ListBox переместился только на половину пути влево. Запустите приложение еще раз. Теперь, когда вы нажимаете на ListBox, будет выбран только один элемент, а ранее выбранный элемент будет отменен (как и должно быть для списка с одним выбором).

Опять же, если я запускаю это на iPad, симуляторе iPad или планшете Android, ListBox работает правильно: когда элемент щелкается в ListBox, ранее выбранный элемент отменяется.

Я не могу быть первым, кто найдет это, поскольку такая анимация так распространена в приложениях. Почему ListBox ведет себя неправильно, и почему в Windows32 он отличается, если я анимирую его только частично за пределами экрана, и почему в Windows32 он отличается от планшета iPad или Android?


person nachbar    schedule 17.09.2013    source источник


Ответы (1)


У меня та же проблема, приложение Win32 с XE5 Update2, список перемещается влево, затем возвращается, но с остатками синей подложки выбора.

Что работает (знаю, очень грязно) для меня, так это запуск таймера сразу после запуска анимации. Интервал таймера составляет 100 мс.

Код в таймере

if lb_liste.selected is TListBoxItem then
lb_liste.selected.isselected:= false;

//lb_liste — это мой список, проблема может заключаться в том, что тогда больше не выбрано ни одного элемента, но меня это устраивало. У меня была эта часть в событии OnProcess TFloatAnimation раньше, но, как ни странно, это вызывало AV всякий раз, когда я разговаривал с базой данных в другой форме, прежде чем возвращаться к моему списку.

Для меня это явно баг в FMX, подождём XE6,7,8

person moe120    schedule 12.02.2014