Как обнаружить / обработать поворот экрана с помощью 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.

Другие вопросы по тегам