如何使用FireMonkey for Delphi XE5检测/处理屏幕旋转

时间:2013-12-31 19:52:09

标签: android delphi firemonkey delphi-xe5 firemonkey-fm3

首先 - 我是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 个答案:

答案 0 :(得分:9)

如果您无法使表单的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;

答案 1 :(得分:6)

使用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;

答案 2 :(得分:4)

您也可以使用下一种方法: 旋转应用程序时,将调用 TForm.OnResize 。因此,您可以在此事件上设置处理程序,并通过服务 IFMXScreenService.GetScreenOrientation 检查当前方向。