← Alle utvidelser

Native utvidelse

KlugLayout

com.klug.layout

INGEN APM NØDVENDIG. Last ned og bruk. Det blir ikke enklere enn dette.

Skjermlayout for Android-nettbrett og sammenleggbare telefoner og for iPhone Duo: liggende format på begge sider, og appen vet når en Fold, Flip eller iPhone Duo åpnes eller lukkes.

Android iOS I produksjon Fra €19 / år · Kjøp

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:

tabletDen store skjermen. Eksempel: en åpnet Galaxy Z Fold eller Pixel Fold.
phoneEn skjerm i telefonstørrelse. Eksempel: en lukket Fold, eller hovedskjermen på en Flip.
coverEn 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

Android arm64 · armv7
iOS arm64 · iPhone Duo

Kom i gang

Legg utvidelsen til i applikasjonsbeskrivelsen din:

app.xml
<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:

app.xml
<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 →

1 · Liggende format på begge sider
Main.as
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
}
2 · Reager når en sammenleggbar enhet åpnes eller lukkes
Fold.as
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
3 · Legg ut for skjermen appen er på nå
Layout.as
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
    }
}
4 · Forlat og gå tilbake til låsen for liggende format
Screens.as
// 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.
isSupportedTrue 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.
displayRotationGjeldende 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.
isFoldableTrue 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.
deviceClassGjeldende klasse: "phone", "tablet" eller "cover"; "" mens den er ukjent. På iOS tilgjengelig etter watchFold(stage) på iPhone Duo.
windowWidth / windowHeightStørrelsen på gjeldende vindu i piksler, følger enheten til den andre skjermen; -1 når den er ukjent.
safeInsetTopToppmarg 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_CHANGEDStatusEvent-kode som sendes ved hver endring av klassen.

Hendelser

deviceTypeChangedphone · 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

Enkel
€19 / år
  • Lisens for én AIR-applikasjon
  • Alle oppdateringer i 12 måneder
  • Ingen støtte
Kjøp Enkel
Standard
€149 / år
  • Lisens for én AIR-applikasjon
  • Alle oppdateringer i 12 måneder
  • Svar på e-post innen 7 dager
Kjøp Standard
Prioritet
€299 / år
  • Lisens for én AIR-applikasjon
  • Alle oppdateringer i 12 måneder
  • Svar på e-post innen 48 timer
Kjøp Prioritet
Skatter og avgifter beregnes ved kassen av Link (Stripe). Du oppgir applikasjons-ID-en til AIR-appen din under kassen.

Krav

AIR SDK51.x (HARMAN)
AndroidAndroid 6.0 (API 23) eller nyere; kamerautsparing fra Android 9 (API 28)
iOSiOS 13 eller nyere; iPhone Duo testet med AIR 51.4.1
TillatelserIngen