Page 1 of 2 1 2 LastLast
Results 1 to 15 of 17

Thread: Screen Orientation

  1. #1

    Screen Orientation

    Ik heb een Andriod App gemaakt waarbij ik alleen een Landscape of Inverse Landscape scherm wil hebben, dus geen Portrait of Inverse Portrait.
    Is er een mogelijkheid om af te vragen in welke stand mijn divice zich bevindt, zodat ik afhankelijk van deze stand de juiste Screen weer kan geven, of is dit op een ander manier mogelijk ?

  2. #2
    Met 1 van deze regels zet ik het scherm vast in een bepaalde stand:
    Application.FormFactor.Orientations := [TScreenOrientation.Landscape];
    Application.FormFactor.Orientations := [TScreenOrientation.InvertedLandscape];
    Application.FormFactor.Orientations := [TScreenOrientation.Portrait];
    Application.FormFactor.Orientations := [TScreenOrientation.InvertedPortrait];

    Voor deze App wil ik het zo voor elkaar zien te krijgen dat deze afhankelijk van de stand van de telefoon/tablet de "Landscape" of "InvertedLandscape" weergeeft.
    En nooit de "Portrait" of "InvertedPortrait".

    Ik krijg maar niet gevonden hoe ik de stand van de telefoon/tablet af kan vragen.
    Zo lijkt de OrientationSensor hier niet voor bedoeld te zijn of toch wel en lees ik deze niet goed uit ?
    Last edited by MMSoft; 30-Mar-18 at 10:05.

  3. #3
    Counting your refs Paul-Jan's Avatar
    Join Date
    Feb 2002
    Location
    Lage Zwaluwe
    Posts
    2,160
    Wanneer je "native" een Android app ontwikkelt, is dit typisch iets wat je *specificeert* in het manifest:

    Code:
    <activity
        android:name=".MainActivity"
        android:screenOrientation="sensorLandscape"        // <------- Of userLandscape, als je nog wel wil dat de user dit weer kan overriden in z'n settings.
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    Als ik het goed begrijp, biedt Delphi je een template waarin je aanpassingen in AndroidManifest.xml kunt doen, wellicht kun je deze instellingen daar gewoon in plaatsen?

    Het kan ook zijn dat Delphi zelf deze setting ergens beheert en 'm keihard weer overschrijft bij het builden, dat weet ik dan niet.

  4. #4
    Quote Originally Posted by MMSoft View Post
    Ik krijg maar niet gevonden hoe ik de stand van de telefoon/tablet af kan vragen.
    Ik had het je ook al eerder per E-mail doorgegeven maar waarom werkte dit niet ????

    Delphi Code:
    1. uses FMX.Platform;
    2.  
    3. procedure TForm1.FormCreate(Sender: TObject);
    4. var
    5.   ScreenService: IFMXScreenService;
    6. begin
    7.   if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
    8.   begin
    9.     if ScreenService.GetScreenOrientation in [TScreenOrientation.soPortrait, TScreenOrientation.soInvertedPortrait] then
    10.         ShowMessage('Portrait Orientation')
    11.     else
    12.     begin
    13.       ShowMessage('Landscape Orientation');
    14.     end;
    15.   end;
    16. end;

    Jij dacht toen dat het resultaat van GetScreenOrientation een string was maar het is dus één van de waardes in TScreenOrientation.
    (Ik had daar geen duidelijk antwoord meer op gekregen)

  5. #5
    Ik kan op deze manier afvragen hoe de stand is als de App start.

    Code:
    begin
      if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
      begin
        if ScreenService.GetScreenOrientation in [TScreenOrientation.soPortrait] then ShowMessage('Portrait');
        if ScreenService.GetScreenOrientation in [TScreenOrientation.soInvertedPortrait] then ShowMessage('Inverted Portrait');
        if ScreenService.GetScreenOrientation in [TScreenOrientation.soLandscape] then ShowMessage('Landscape');
        if ScreenService.GetScreenOrientation in [TScreenOrientation.soInvertedLandscape] then ShowMessage('Inverted Landscape');
     end;
    In geval van Portrait of InvertedPortrait kan ik deze weergave zelf wijzigen met:
    Code:
    if ScreenService.GetScreenOrientation in [TScreenOrientation.soInvertedPortrait] then Application.FormFactor.Orientations := [TScreenOrientation.Landscape];  
    of
    ... Application.FormFactor.Orientations := [TScreenOrientation.InvertedLandscape];
    Dat is geen probleem, maar het gaat over een telefoon en die heb je in de hand dus de stand kan zo weer wijzigen en dan werkt de code van het afvragen niet meer.
    Ook niet als je deze code regelmatig doorloopt omdat de weergave dan vast staat in bijvoorbeeld Landscape.
    Daarom wil ik graag de "sensor" uitlezen.

  6. #6
    Raar. IFMXScreenService.GetScreenOrientation zou bij elke FormResize (en dus ook bij rotatie) gewoon weer de juiste waarde moeten krijgen.

    Misschien kun je de code van de volgende oplossingen proberen.
    https://stackoverflow.com/a/36552685/1037511

  7. #7
    Wat ik ook probeer het probleem blijft als er 1 keer het scherm in een positie plaats met deze code
    Application.FormFactor.Orientations := [TScreenOrientation.xxxxxxxx];
    Dan krijg ik alleen nog maar deze stand bij het uitlezen met
    ScreenService.GetScreenOrientation

    Zou het niet mogelijk zijn om direct de sensor die deze beweging detecteert, uit te lezen ?

  8. #8
    Heb je het voorbeeld waarnaartoe ik verwees geprobeerd? Ik heb het even gedaan (Yikes, wat haat ik Delphi for Android) en ik kreeg een foutmelding in de OnResize en moest even met een hulpvariabele (lelijke hack) werken.

    Maar daarna werkte het prima. Na het klikken van de button wordt de OnResize "geactiveerd" en elke keer als ik het scherm kantelde, kreeg ik netjes de showmessage met de nieuwe oriëntatie. Dus wat er bij jou mis gaat weet ik ook niet.

    Of je met de sensors kan werken weet ik niet en dat mag iemand anders je vertellen.

    Delphi Code:
    1. uses FMX.Platform;
    2.  
    3. var
    4.   Doe: Boolean = false;
    5.  
    6. procedure TForm15.Button1Click(Sender: TObject);
    7. begin
    8.   Showmessage('Hello');
    9.   Doe := true;
    10. end;
    11.  
    12. procedure TForm15.FormResize(Sender: TObject);
    13. var
    14.   ScreenService: IFMXScreenService;
    15. begin
    16.   if not Doe then exit;
    17.  
    18.   if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
    19.   begin
    20.     if ScreenService.GetScreenOrientation in [TScreenOrientation.soPortrait, TScreenOrientation.soInvertedPortrait] then
    21.       ShowMessage('Portrait Orientation')
    22.     else
    23.     begin
    24.       ShowMessage('Landscape Orientation');
    25.     end;
    26.   end;
    27. end;

  9. #9
    Omdat ik dus geen "Portrait" weergave moet hebben, wijzig ik deze op dat moment in "Landscape", en vervolgens werkt deze code dus niet meer als ik de telefoon draai.
    Dat is het probleem dus, en daarom zou ik graag meteen de sensor zelf uit kunnen lezen.
    Code:
    procedure TForm1.FormResize(Sender: TObject);
    var
      ScreenService: IFMXScreenService;
    begin
      if not Doe then exit;
    
      if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
      begin
        if ScreenService.GetScreenOrientation in [TScreenOrientation.soPortrait, TScreenOrientation.soInvertedPortrait] then
          //ShowMessage('Portrait Orientation')
          Application.FormFactor.Orientations := [TScreenOrientation.Landscape]
        else
        begin
          ShowMessage('Landscape Orientation');
        end;
      end;
    end;
    Mogelijk is er nog een of andere mogelijkheid om de "Portrait" weergave te blokkeren.

  10. #10
    Quote Originally Posted by MMSoft View Post
    Omdat ik dus geen "Portrait" weergave moet hebben, wijzig ik deze op dat moment in "Landscape", en vervolgens werkt deze code dus niet meer als ik de telefoon draai.
    Dat is het probleem dus, en daarom zou ik graag meteen de sensor zelf uit kunnen lezen.
    ...
    Mogelijk is er nog een of andere mogelijkheid om de "Portrait" weergave te blokkeren.
    Ik denk het nu eindelijk te begrijpen. (hoewel?)

    Je zet je scherm VAST landscape maar wil wel weten of je telefoon "recht" gehouden wordt. Dan moet je dus niet meer over orientation spreken want je hebt je telefoon vast op de landscape orientation gezet. Dat was dus heel verwarrend hoe je dat dan uitlegde.

    Nee, met screenorientation krijg je dus alleen hoe je scherm ook daadwerkelijk georiënteerd is.

    Maar waarom wil je weten of je scherm anders gehouden als je je scherm-oriëntatie al vast gezet hebt?

    Als je, zoals je in je beginpost zegt, een ander scherm zichtbaar wilt maken afhankelijk van de scherm-oriëntatie dan moet je je scherm dus NIET vastzetten op één oriëntatie. Dus ik begrijp nog steeds je bedoeling niet

    Je kunt na het vastzetten op landscape de Application.FormFactor.Orientations gewoon weer op alle mogelijkheden zetten. Dan wordt de OnResize wel weer getriggered bij het kantelen en kun je doen wat je wilt. Maar aangezien ik niet weet wat je echt wilt kan ik niet zeggen of je daarmee geholpen bent.

  11. #11
    Ik wil alleen de Landscape of InvertedLandscape kunnen krijgen.
    Deze moeten wel gewijzigd kunnen worden (door middel van het draaien van het toestel) terwijl de App actief is.

  12. #12
    Dus gewoon dit:
    Delphi Code:
    1. procedure TForm1.FormCreate(Sender: TObject);
    2. begin
    3.   Application.FormFactor.Orientations := [TScreenOrientation.Landscape, TScreenOrientation.InvertedLandscape];
    4. end;

    Dan wordt alleen Landscape en InvertedLandscape toegestaan.
    Je hoeft helemaal niets te controleren.

  13. #13
    Helaas wordt alleen de Landscape getoond en hoe ik de telefoon ook draai er veranderd niets.
    In de code staat nergens meer een gedwongen weergave.
    Bij de Properties van het Form, heb ik bij Orientations, zowel alles aan dan wel uit gezet om de code te testen (ik zie geen verschil).

    Edit:
    Het valt mij op dat als ik alle code verwijder die met de scherm Orientation te maken heeft, er maar 3 standen worden getoond, ik krijg namelijk nooit de InvertedPortrait te zien.
    Last edited by MMSoft; 04-Apr-18 at 11:10.

  14. #14
    Nee, volgens mij kan Delphi (of Android uberhaupt) geen invertedPortrait aan.

    Maar dit is dus één van de redenen waarom ik Delphi for Android haat. Een simpel dingetje als Landscape en invertedLandscape zijn niet in te stellen schijnbaar. En er is totaal niets te vinden over op internet. Nee, Delphi for Android is "not for me".

    (We hadden het al gezien bij dat hele map-gedoe, gps sensor en andere simpele dingetjes die veel te moeilijk zijn in Delphi en heel simpel in Android Studio)

  15. #15
    Dan zit er nog maar 1 ding op, en dat is het Form op de een of ander manier te blokkeren door bijvoorbeeld alles donker te maken ofzo, op het moment dat er Portrait weergaven is.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •