Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Android] Горизонтальная ориентация экрана


Rusland

Вопрос

Никак не могу разобраться со сменой ориентации в приложении.

Когда в Project options -> Application -> Orientation не стоит галочка Enable custom orientation, то при разных поворотах устройства приложение само переворачивается (тут все понятно).

Мне же нужно что была только горизонтальная ориентация обычная и перевернутая (Landscape и  Inverted landscape). 

Я ставлю галочку Enable custom orientation и выбираю Landscape home right и Landscape home left. В приложении ориентация становиться Landscape home right и как бы я не переворачивал устройство, ориентация не меняется. Собственно об этом и в справке написано, но почему? Вдруг пользователю во время работы нужна ориентация Landscape home left? Автоматически меняться не будет, нужно вручную?

Объясните как правильно менять ориентацию?

 

PS. Все темы про раздела прочитал, понимание не пришло.

PPS. 

  Application.Initialize;
  Application.FormFactor.Orientations := [TFormOrientation.Landscape, TFormOrientation.InvertedLandscape];
  Application.CreateForm(TForm1, Form1);
  Application.Run;

 

Изменено пользователем Rusland
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Если, например, отметить три галки: PortraitLandscape home right и Landscape home left, то при запуске приложение встает в режим Portrait и не меняет ориентацию, как бы я не крутил устройство. Значит надо как-то самому обрабатывать повороты устройства?

Ссылка на комментарий
  • 0

Хочу, например, узнать состояние ориентации устройства - тут сказано что нужно создать Handler.

Допустим я ставлю только галки Landscape home right и Landscape home left.  Дальше в коде пытаюсь определить изменение ориентации:

uses
  FMX.Forms, FMX.Messages, FMX.Types;

//In the definition of TFooForm you define:
FOrientationChangedId: Integer;
procedure OrientationChangedHandler(const Sender: TObject; const Msg: TMessage);

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOrientationChangedId := TMessageManager.DefaultManager.SubscribeToMessage(
  TOrientationChangedMessage, OrientationChangedHandler);
end;

procedure TForm1.OrientationChangedHandler(const Sender: TObject; const Msg: TMessage);
var
  ScreenService: IFMXScreenService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
  begin
    if ScreenService.GetScreenOrientation in [TScreenOrientation.Portrait] then
      Log('Portrait Orientation')
    else if ScreenService.GetScreenOrientation in [TScreenOrientation.InvertedPortrait] then
      Log('InvPortrait Orientation')
    else if ScreenService.GetScreenOrientation in [TScreenOrientation.Landscape] then
      Log('Landscape Orientation')
    else if ScreenService.GetScreenOrientation in [TScreenOrientation.InvertedLandscape] then
      Log('InvLandscape Orientation');
  end;
end;

procedure TForm1.Log(s: string);
begin
  Memo1.Lines.Add(TimeToStr(Now) + ': ' + s);
end;

Но код срабатывает только если переворачивается само приложение (а не устройство). 

Если снять галочку  Enable custom orientation , то Handler отрабатывает на всех положениях (ну оно и понятно). В общем пока не знаю как решить этот вопрос...

Ссылка на комментарий
  • 0

Очень просто:
======================

program Project1;

uses
  System.StartUpCopy,
  FMX.Forms,
  Androidapi.Helpers,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  TAndroidHelper.Activity.setRequestedOrientation(TJActivityInfo.JavaClass.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

======================
Если укажите SCREEN_ORIENTATION_SENSOR_PORTRAIT, то будет только портретная ориентация, но картинка переворачивается на InvertedPortrait только на планшетах.


 

Изменено пользователем Andrew
Ссылка на комментарий
  • 0
В 12.07.2016 в 15:53, Rusland сказал:

Хочу, например, узнать состояние ориентации устройства - тут сказано что нужно создать Handler.

Допустим я ставлю только галки Landscape home right и Landscape home left.  Дальше в коде пытаюсь определить изменение ориентации:


uses
  FMX.Forms, FMX.Messages, FMX.Types;

//In the definition of TFooForm you define:
FOrientationChangedId: Integer;
procedure OrientationChangedHandler(const Sender: TObject; const Msg: TMessage);

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOrientationChangedId := TMessageManager.DefaultManager.SubscribeToMessage(
  TOrientationChangedMessage, OrientationChangedHandler);
end;

procedure TForm1.OrientationChangedHandler(const Sender: TObject; const Msg: TMessage);
var
  ScreenService: IFMXScreenService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
  begin
    if ScreenService.GetScreenOrientation in [TScreenOrientation.Portrait] then
      Log('Portrait Orientation')
    else if ScreenService.GetScreenOrientation in [TScreenOrientation.InvertedPortrait] then
      Log('InvPortrait Orientation')
    else if ScreenService.GetScreenOrientation in [TScreenOrientation.Landscape] then
      Log('Landscape Orientation')
    else if ScreenService.GetScreenOrientation in [TScreenOrientation.InvertedLandscape] then
      Log('InvLandscape Orientation');
  end;
end;

procedure TForm1.Log(s: string);
begin
  Memo1.Lines.Add(TimeToStr(Now) + ': ' + s);
end;

Но код срабатывает только если переворачивается само приложение (а не устройство). 

Если снять галочку  Enable custom orientation , то Handler отрабатывает на всех положениях (ну оно и понятно). В общем пока не знаю как решить этот вопрос...

У тебя получилось решение задачи?

Расскажи плиз, как делаешь..

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...