Как обнаружить / обработать поворот экрана с помощью FireMonkey для Delphi XE5
Прежде всего - я новичок в программировании на Android и FireMonkey, поэтому имейте это в виду:-).
Я создал приложение FireMonkey/Android, которое может изменять размеры / перекомпоновывать свои элементы управления в соответствии с размером экрана и ориентацией, но я не могу понять, как настроить приложение для вызова, когда пользователь поворачивает экран. Если я запускаю в нем Firemonkey/Win32 и показываю кнопку, которая делает следующее:
PROCEDURE TMainForm.FlipForm;
VAR
W,H : INTEGER;
BEGIN
W:=Width; H:=Height; Width:=H; Height:=W
END;
и затем перехватывает событие FormResize, моя форма изменяет размеры / перекомпоновывает, как и должно. Я хотел бы сделать то же самое при работе на Android, но кажется, что событие FormResize не вызывается при повороте экрана, поэтому мои кнопки и т. Д. Не перезагружаются и оказываются вне экрана.
Итак, мой вопрос: как я могу определить, что экран повернулся, чтобы мое приложение могло работать как в альбомном, так и в портретном режиме?
3 ответа
Если вы не можете получить форму OnResize
событие, чтобы работать, то вы можете подписаться на сообщение об изменении ориентации FMX таким образом:
uses
FMX.Forms, FMX.Messages, FMX.Types;
//In the definition of TFooForm you define:
FOrientationChangedId: Integer;
procedure OrientationChangedHandler(const Sender: TObject; const Msg: TMessage);
//Subscribe to orientation change events in OnCreate or similar
FOrientationChangedId := TMessageManager.DefaultManager.SubscribeToMessage(
TOrientationChangedMessage, OrientationChangedHandler);
//Unsubscribe from orientation change events in OnDestroy or similar
TMessageManager.DefaultManager.Unsubscribe(
TOrientationChangedMessage, FOrientationChangedId);
procedure TFooForm.OrientationChangedHandler(const Sender: TObject; const Msg: TMessage);
begin
Log.d('Orientation has changed');
end;
Использовать IFMXScreenService лучше, если он поддерживается платформой, поэтому, если он не поддерживается, генерируется "ошибка сегментации", я использую его следующим образом:
uses FMXPlatform;
...
procedure TForm2.FormResize(Sender: TObject);
var
ScreenService: IFMXScreenService;
begin
if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
begin
if ScreenService.GetScreenOrientation in [TScreenOrientation.soPortrait, TScreenOrientation.soInvertedPortrait] then
ShowMessage('Portrait Orientation')
else
Begin
ShowMessage('Landscape Orientation');
End;
end;
end;
Вы также можете использовать следующий подход: когда приложение вращается, вызывается TForm.OnResize. Таким образом, вы можете установить обработчик для этого события и проверить текущую ориентацию через сервис IFMXScreenService.GetScreenOrientation.