Site icon Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Платформонезависимый скроллинг в Fire Monkey

Author: Сергей

Одно из нововведений в XE4 это платформонезависимый скроллинг.
С самого начала в Fire Monkey был компонент TScrollBox, который является предком для многих других компонентов (TListBox, TTreeView, TMemo и т.п.). Это контейнер который может содержать различные контролы, при этом они могут выходить далеко за границы видимой области TScrollBox.

На картинке изображается TScrollBox в RunTime и в DesignTime. Если упрощенно рассмотреть его структуру, то данный компонент (стилизованный контрол), содержит в себе полосы прокрутки и контрол ContentLayout обозначающий видимую область (на нижней картинке выделен темно-серым прямоугольником). Размеры ContentLayout соответствуют свойству ViewportSize для полос прокрутки.

На ContentLayout располагается контрол Content (содержимое ScrollBox`а). Когда мы бросаем какую-нибудь кнопку в TScrollBox, то она в реальности попадает в Content и когда мы перемещаем изображение внутри TScrollBox, на самом деле изменяются координаты Content.

Рассмотрим некоторые свойства:

Если создавать наследника TScrollBox, то можно перекрыть виртуальные методы: HScrollChange, VScrollChange, ViewportPositionChange, DoCalcContentBounds вместо использования событий.

За плавное перемещение отвечает свойство AniCalculations

Вся логика отвечающая за поведение контрола при перетаскивании содержимого, вынесена в класс TAniCalculations который находится в модуле FMX.InertialMovement.

Свойство TScrollBox.AniCalculations создаётся с использованием виртуального метода CreateAniCalculations, перекрыв этот метод можно использовать свои классы для управления перемещением.

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

procedure TVertScrollBox.DoUpdateAniCalculations(const AAniCalculations: TScrollCalculations);
begin
  inherited DoUpdateAniCalculations(AAniCalculations);
  AAniCalculations.TouchTracking := AAniCalculations.TouchTracking - [ttHorizontal];
end;

Изменить текущие значения свойств можно во время работы приложения, таким образом, к примеру, в Windows, можно заставить перемещаться содержимое по инерции, как это делается в iOS.

Для начала пожалуй хватит…

Exit mobile version