Oversikt
Noen apper er laget kun for liggende format, for eksempel en kamerastasjon på et nettbrett. Brukerne forventer likevel at bildet står riktig vei uansett hvordan de plasserer enheten: med knappene til venstre eller til høyre.
KlugLayout setter Android-skjermorienteringen til liggende format på begge sider. Appen forblir i liggende format, men snur 180 grader med enheten. Den rapporterer også gjeldende skjermrotasjon, slik at en app kan tilpasse sitt eget innhold, for eksempel et kamerabilde, til hvordan enheten holdes.
Sammenleggbare enheter endrer skjermen mens appen kjører. En Galaxy Z Fold eller Pixel Fold er et nettbrett når den er åpen og en telefon når den er lukket; en Galaxy Z Flip går fra den høye hovedskjermen til en liten, nesten kvadratisk dekkskjerm. Når enheten flytter appen til den andre skjermen, mottar ikke AIR-scenen alltid en resize-hendelse, og oppstartsverdiene for skjermstørrelse og kamerautsparing forblir de fra den første skjermen. KlugLayout overvåker dette native og forteller appen hva slags skjerm den er på nå.
KlugLayout brukes daglig i appene våre på Android-nettbrett, vårt proof of concept.
Sammenleggbare enheter
KlugLayout sorterer det gjeldende vinduet i én av tre klasser og sender en hendelse hver gang klassen endres:
| tablet | Den store skjermen. Eksempel: en åpnet Galaxy Z Fold eller Pixel Fold. |
| phone | En skjerm i telefonstørrelse. Eksempel: en lukket Fold, eller hovedskjermen på en Flip. |
| cover | En liten ytre skjerm. Eksempel: dekkskjermen på en Galaxy Z Flip. |
Når en Fold er lukket, oppheves låsen til liggende format slik at den ytre skjermen i telefonstørrelse kan bruke stående format, og den kommer tilbake når enheten åpnes igjen. Appen får også størrelsen og kamerautsparingen til den gjeldende skjermen, slik at en layout som bygges etter sammenfolding passer til skjermen den vises på.
I appene våre logger visningssiden ut og inn igjen ved hver endring av fold eller dekkskjerm, slik at live-strømmer alltid starter rent på den nye skjermen. På Flip-dekkskjermen er grensesnittet lagt ut for en vanlig telefon og skalert ned for å passe.
Testet i Android-emulatoren på enhetsprofilene Pixel 9 Pro Fold og Galaxy Z Flip.
iPhone Duo
iPhone Duo er Apples første sammenleggbare enhet: en telefon når den er lukket, et lite nettbrett når den er åpen. AIR følger ikke med på egen hånd. Når enheten åpnes, kan iOS la appen bli værende i det letterboxede telefonvinduet, ingen resize-hendelse kommer, og oppstartsverdiene for skjermen forblir de fra den ytre skjermen.
KlugLayout oppdager på iOS hvilken skjerm appen er på og sender den samme DEVICE_TYPE_CHANGED-hendelsen som på Android: "phone" når Duo er lukket, "tablet" når den er åpen. Den samme koden dekker begge plattformer.
Status: de grunnleggende layoutene er løst. Lukkede og åpne layouter, sammenfolding og utfolding mens appen kjører, rotasjon av den åpne enheten og sentrerte native dialoger fungerer. Streaming- og kamerainnstillinger må fortsatt testes på den virkelige enheten.
Det er ingen grunn til å vente på AIR 52: fra april 2027 må App Store-opplastinger bygges med iOS 27 SDK, og fra da av møter en AIR-app iPhone Duo som den sammenleggbare enheten den er. KlugLayout håndterer det i dag, med AIR 51.4.1.
Testet i Xcode 27-simulatoren (iPhone Duo) med HARMAN AIR 51.4.1.
Funksjoner
- Selvstendig: én ANE, ingen kjernebibliotek eller avhengige ANE-er å legge til
- Liggende format på begge sider, snur med enheten
- Fold-gjenkjenning: tablet, phone eller Flip-dekkskjerm, med en hendelse ved hver endring
- iPhone Duo: phone når lukket, tablet når åpen, med samme hendelse som på Android
- Låsen til liggende format oppheves automatisk mens en Fold er lukket
- Størrelse og kamerautsparing for gjeldende skjerm, også etter sammenfolding
- Ingen overgang til stående format
- Gjeldende skjermrotasjon: 0, 90, 180 eller 270 grader
- Aktiv fra appen starter
- Gjør ingenting på andre plattformer, slik at koden kan bli værende i en plattformuavhengig app
Støttede plattformer
Kom i gang
Legg utvidelsen til i applikasjonsbeskrivelsen din:
<extensions>
<extensionID>com.klug.layout</extensionID>
</extensions>
Apper som målretter Android 16 bør også tillate fast orientering på store skjermer med denne egenskapen inne i <application> i manifesttilleggene:
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true"/>
Kodeeksempler
Fire komplette flyter, hentet fra API-et som kjører i appene våre. Kall returnerer med en gang; endringer av skjermen kommer som en StatusEvent. Full dokumentasjon →
import com.klug.layout.KlugLayout; import flash.display.StageAspectRatio; import flash.events.StageOrientationEvent; var layout:KlugLayout = KlugLayout.getInstance(); // isSupported is false on desktop platforms: every call below is then a no-op, // so this code can stay in a cross-platform app stage.autoOrients = true; stage.setAspectRatio( StageAspectRatio.LANDSCAPE ); // first AIR's landscape ... layout.setSensorLandscape(); // ... then both sides on Android // (on iOS LANDSCAPE already allows both sides) // turn your own content, such as a camera picture, with the device updatePicture(); stage.addEventListener( StageOrientationEvent.ORIENTATION_CHANGE, function( e:StageOrientationEvent ):void { updatePicture(); }); function updatePicture():void { var rotation:int = layout.displayRotation; // 0, 90, 180 or 270; -1 = unknown if ( rotation != -1 ) rotateCameraPicture( rotation ); // your app function }
import flash.events.StatusEvent; layout.addEventListener( StatusEvent.STATUS, onLayout ); layout.watchFold( stage ); // pass the stage: iOS needs it for the iPhone Duo // events report changes only; read the class once for the start var startClass:String = layout.deviceClass; // "phone", "tablet", "cover" or "" (unknown) showLayoutFor( startClass != "" ? startClass : chooseFromStage() ); // your own default function onLayout( e:StatusEvent ):void { if ( e.code != KlugLayout.DEVICE_TYPE_CHANGED ) return; showLayoutFor( e.level ); // "tablet" or "phone"; "cover" on a Galaxy Z Flip (Android) } // fold-only behaviour, kept away from normal phones and tablets if ( layout.isFoldable ) enableFoldHints(); // your app function
function showLayoutFor( deviceClass:String ):void { // size of the current window in pixels, also after the device moved the app // to its other display; -1 = unknown, then fall back to the stage var w:int = layout.windowWidth > 0 ? layout.windowWidth : stage.stageWidth; var h:int = layout.windowHeight > 0 ? layout.windowHeight : stage.stageHeight; // top inset of the current display (Android: camera cutout, from Android 9) var top:int = Math.max( 0, layout.safeInsetTop ); // -1 = unknown if ( deviceClass == "tablet" ) buildTabletViews( w, h, top ); // your app functions else { buildPhoneViews( w, h, top ); if ( deviceClass == "cover" ) scaleToFit( w, h ); // phone layout, scaled down } }
// while a Fold is closed the lock is suspended on its own and comes back when it is opened. // release() is for screens where the app itself leaves landscape (Android; no-op on iOS). function openPortraitScreen():void { layout.release(); // remove the landscape lock stage.setAspectRatio( StageAspectRatio.PORTRAIT ); // AIR decides again } function openStationScreen():void { stage.setAspectRatio( StageAspectRatio.LANDSCAPE ); layout.setSensorLandscape(); // both landscape sides again }
API-oversikt
| KlugLayout.getInstance() | Returnerer den ene instansen. |
| isSupported | True på Android og iOS. False andre steder; hvert kall er da en no-op. |
| setSensorLandscape() | Liggende format på begge sider, snur med enheten. Kall den etter stage.setAspectRatio(StageAspectRatio.LANDSCAPE). Android; på iOS tillater LANDSCAPE allerede begge sider. |
| displayRotation | Gjeldende skjermrotasjon i grader (0, 90, 180, 270), eller -1. |
| watchFold( stage ) | Begynner å overvåke endringer av fold og dekkskjerm, også uten lås til liggende format. På iOS trengs scenen for iPhone Duo. |
| isFoldable | True på sammenleggbar maskinvare: Android-foldables (Android 11 eller nyere) og iPhone Duo. |
| release() | Fjerner låsen til liggende format, for eksempel når appen bytter til en telefonlayout. Android; no-op på iOS. |
| deviceClass | Gjeldende klasse: "phone", "tablet" eller "cover"; "" mens den er ukjent. På iOS tilgjengelig etter watchFold(stage) på iPhone Duo. |
| windowWidth / windowHeight | Størrelsen på gjeldende vindu i piksler, følger enheten til den andre skjermen; -1 når den er ukjent. |
| safeInsetTop | Toppmarg for gjeldende skjerm i piksler: kamerautsparingen på Android (Android 9 eller nyere), det øvre sikre området på iOS; -1 når den er ukjent. |
| DEVICE_TYPE_CHANGED | StatusEvent-kode som sendes ved hver endring av klassen. |
Hendelser
| deviceTypeChanged | phone · tablet · cover (cover: ytre skjerm på Galaxy Z Flip, Android). Sendes etter watchFold(stage), på Android også etter setSensorLandscape(); kun ved endringer. |
Kjøp KlugLayout
En årslisens for én AIR-applikasjon, med alle oppdateringer i 12 måneder. Etter betaling mottar du utvidelsen, ActionScript-biblioteket og dokumentasjonen på e-post, vanligvis innen én virkedag. Lisens og vilkår
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Ingen støtte
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Svar på e-post innen 7 dager
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Svar på e-post innen 48 timer
Krav
| AIR SDK | 51.x (HARMAN) |
| Android | Android 6.0 (API 23) eller nyere; kamerautsparing fra Android 9 (API 28) |
| iOS | iOS 13 eller nyere; iPhone Duo testet med AIR 51.4.1 |
| Tillatelser | Ingen |