首先 - 我是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事件,因此我的按钮等不会重排并最终在屏幕外。
所以我的问题是,如何检测屏幕已旋转,以便我可以让我的应用程序在横向和纵向模式下工作?
答案 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 检查当前方向。