Перейти к содержанию
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
Опубликовано

Если, например, отметить три галки: Portrait,  Landscape 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 эмодзи.

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

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

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

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