4

首先 - 我是 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 事件,因此我的按钮等不会重排并最终出现在屏幕之外。

所以我的问题是,我如何检测到屏幕已经旋转,以便我的应用程序可以在横向和纵向模式下工作?

4

3 回答 3

10

如果您无法让表单的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;
于 2013-12-31T21:43:03.980 回答
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;
于 2016-04-11T15:15:28.447 回答
4

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

于 2014-01-14T15:07:23.643 回答