【问题标题】:How do I detect / handle a screen rotate using FireMonkey for Delphi XE5如何使用 FireMonkey for Delphi XE5 检测/处理屏幕旋转
【发布时间】:2014-01-18 16:45:10
【问题描述】:

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

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

【问题讨论】:

  • C:\Users\Public\Documents\RAD Studio\12.0\Samples\FireMonkeyMobile\Delphi\Forms有一个调整屏幕旋转的演示。

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


【解决方案1】:

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

【讨论】:

  • 优秀。现在这可行,但似乎我没有得到正确的屏幕尺寸,但只有 1280x800 的屏幕尺寸(底部的菜单栏),即使我的平板电脑是 2560x1600。我怎样才能让 Android 理解,我可以处理任何和所有屏幕尺寸(我自己调整我的按钮等),并且它不应该应用任何缩放,而只允许我使用全屏尺寸?当我在我的重排代码中读取 Screen.Size 时,它​​总是返回 1280x752(横向)或 800x1232(纵向)。
  • Addeddum:为了便于开发,我让我的 MainForm 使用 1280x800 预定义的大小。使使用设计器更容易。但我仍然希望能够使用目标设备的完整尺寸并自己缩放和/或重排我的控件...
  • 我认为您可以使用以下方法获得固有的屏幕缩放: var ScreenService: IFMXScreenService;规模:单一; ... 如果 TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) 则 Scale := ScreenService.GetScreenScale else Scale := 1;
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2021-11-16
      • 2012-10-04
      相关资源
      最近更新 更多