Window Size Class — какво е, класове размери и разработка

Автор: IT Sectr Публикувано: 2026-06-08 Време за четене: 9 мин

Window Size Class е API от Jetpack WindowManager, който разделя прозореца на приложението на три категории: Compact, Medium и Expanded. Вместо да проверява физическата резолюция или плътността на пикселите, класовете анализират наличната ширина в dp — това дава предвидим резултат на всяко устройство. Според Android Developers Documentation (2025), Window Size Class стана стандарт за адаптивни интерфейси в Jetpack Compose и View системата благодарение на WindowManager.

Основни неща

  • Window Size Class — API за категоризиране на ширината на прозореца на Compact, Medium и Expanded.
  • Compact — клас за тесни прозорци до 600 dp, типични за телефони в портретен режим.
  • Medium — клас за прозорци 600–840 dp, характерни за таблети в портрет и телефони в пейзаж.
  • Expanded — клас за широки прозорци от 840 dp, срещащи се на таблети и десктоп.
  • Material Design 3 използва Window Size Class като основа за adaptive layout.

Какво е Window Size Class?

Window Size Class е API на платформата Android, част от библиотеката Jetpack WindowManager, която класифицира наличното пространство на прозореца на приложението в три категории. За разлика от традиционния подход с количествени показатели на ресурси (small/large/xlarge), Window Size Class предоставя дискретен набор от стойности, на които разработчикът може да разчита при проектирането на интерфейса.

API се появи в Android 7.0 Nougat като част от поддръжката на режим с множество прозорци, но активното внедряване започна с Jetpack WindowManager 1.1 (2022). Google препоръчва Window Size Class като основен инструмент за изграждане на адаптивни оформления вместо проверка на ширината на екрана чрез Display.getSize().

Класификацията се основава на ширината на прозореца в dp, а не на физическия размер или плътността на пикселите. Това означава, че две устройства с различна резолюция, но еднаква ширина в dp ще получат един и същ клас — интерфейсът ще бъде предвидимо еднакъв.

Три класа размери на прозореца в Android

Compact — клас за прозорци с ширина до 600 dp. Телефон в портретен режим, повечето сгъваеми телефони (Galaxy Z Flip) в затворено състояние. Интерфейсът се изгражда в една колона, навигация чрез Bottom Navigation.

Medium — клас за прозорци с ширина 600–840 dp. Таблет в портрет, телефон в пейзаж, сгъваемо устройство в полуотворено състояние. Интерфейсът използва две колони — например списък отляво и детайли отдясно. Navigation Rail заменя Bottom Navigation.

Expanded — клас за прозорци с ширина от 840 dp. Таблет в пейзаж, десктоп прозорец, сгъваемо устройство в разгънато състояние. Интерфейсът може да използва три или повече панела, Permanent Navigation Drawer, панели с инструменти.

В Material Design 3 за всеки клас са дефинирани адаптивни компоненти: Navigation Rail за Medium, Navigation Drawer за Expanded, Bottom Navigation за Compact. Разработчикът не трябва да избира breakpoints — те вече са зададени от API.

Как работи Window Size Class

Window Size Class се изчислява въз основа на текущата ширина на прозореца на приложението в dp, като се вземат предвид системните елементи — лента за състояние, навигационен панел, разделяне на екрана в Split Screen. API реагира на промяна в конфигурацията на прозореца: завъртане на устройството, влизане в режим с множество прозорци, разгъване на сгъваемо устройство.

За получаване на класа се използва класът WindowSizeClass от библиотеката androidx.window. Разработчикът се абонира за Flow (Kotlin) или LiveData (Java), който автоматично актуализира класа при всяка промяна на размера на прозореца — без ръчна обработка на onConfigurationChanged.

Класификацията се извършва в три стъпки. Първа — измерване на текущата ширина на прозореца в пиксели. Втора — конвертиране в dp чрез DisplayMetrics.density. Трета — сравняване на получената стойност с праговете: по-малко от 600 dp — Compact, 600–840 — Medium, от 840 — Expanded.

kotlin
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass()

when (windowSizeClass.windowWidthSizeClass) {
    WindowWidthSizeClass.COMPACT -> // компактна ширина
    WindowWidthSizeClass.MEDIUM  -> // средна ширина
    WindowWidthSizeClass.EXPANDED -> // разширена ширина
}

Освен ширина (windowWidthSizeClass), API предоставя клас за височина на прозореца (windowHeightSizeClass) — полезно за пейзажна ориентация и десктоп прозорци.

Window Size Class в Jetpack Compose

В Jetpack Compose Window Size Class се използва чрез функцията currentWindowAdaptiveInfo(), която връща WindowAdaptiveInfo с класове за ширина и височина. Тази функция взема предвид не само размера на прозореца, но и типа на въвеждане (клавиатура, мишка, докосване) — чрез WindowPosture и WindowLayoutInfo.

Типичен сценарий — превключване между оформления в зависимост от класа. Например на Compact се показва BottomSheet с избор, на Medium — страничен панел, на Expanded — постоянен Navigation Drawer.

kotlin
@Composable
fun AdaptiveNavigation(windowSizeClass: WindowWidthSizeClass) {
    when (windowSizeClass) {
        WindowWidthSizeClass.COMPACT -> BottomNavigation()
        WindowWidthSizeClass.MEDIUM  -> NavigationRail()
        WindowWidthSizeClass.EXPANDED -> NavigationDrawer()
    }
}

В Material Design 3 компонентите NavigationSuiteScaffold автоматично се адаптират към Window Size Class — разработчикът не трябва да пише условна логика.

Window Size Class и Material Design 3

Material Design 3 (Material You) е напълно интегриран с Window Size Class. Системата adaptive layout в Material 3 определя кой навигационен компонент да се използва във всеки клас: BottomNavigation за Compact, NavigationRail за Medium, NavigationDrawer за Expanded.

Тази интеграция работи на ниво Adaptive API, което комбинира Window Size Class с други сигнали — FoldState (сгъваемо устройство) и WindowPosture (позиция на екрана). Adaptive API е достъпен чрез библиотеката material3-adaptive.

Material 3 предоставя четири адаптивни компонента от високо ниво: ListDetailPaneScaffold, SupportingPaneScaffold, NavigationSuiteScaffold и AdaptiveSheet. Всеки от тях променя поведението си в зависимост от Window Size Class без допълнителна конфигурация.

КласNavigation ComponentPane Scaffold
CompactBottom NavigationСкрит панел
MediumNavigation RailИзплъзващ се панел
ExpandedNavigation DrawerПостоянен панел

Предимства на адаптивните оформления

Използването на Window Size Class дава три ключови предимства в мобилното разработване. Първо — предвидимост: вместо стотици комбинации от размери на екрана, разработчикът работи с три класа. Това драстично намалява броя на тестовите сценарии и грешките, свързани с оформлението.

Второ — автоматична адаптация към режим с множество прозорци. Когато потребителят влезе в Split Screen, ширината на прозореца се променя — Window Size Class незабавно се преизчислява и интерфейсът се адаптира. Без това API, приложението в разделен екран показва съкратена версия на интерфейса за телефон.

Трето — консистентност с Material Design 3. Google вгради Window Size Class в системата от адаптивни компоненти, така че интерфейсите, изградени на Material 3, автоматично следват препоръките на Google за дизайн на големи екрани без допълнителна работа.

Често задавани въпроси

Как се различава Window Size Class от Screen Size Buckets?

Screen Size Buckets (small/large/xlarge) — остарял подход от Android 1.6–6.0, основан на физическия размер на екрана. Window Size Class се фокусира върху наличната ширина на прозореца в dp и работи в реално време при промяна на размера на прозореца.

Трябва ли да поддържам Window Size Class на Android 6 и по-стари?

Window Size Class е достъпен чрез Jetpack WindowManager на Android 7.0+ с backport библиотека. За Android 6 и по-стари — само Compact, тъй като multi-window липсва. Използвайте fallback чрез WindowMetrics.

Как работи Window Size Class на сгъваеми устройства?

При разгъване на устройството ширината на прозореца се променя и Window Size Class автоматично се преизчислява. Класът може да се промени от Compact на Expanded поради увеличаване на наличната площ.

Може ли да се използва Window Size Class в XML (Views)?

Да, чрез WindowManager в Activity или Fragment. След получаване на WindowSizeClass използвайте условна логика за превключване между XML оформления или промяна на видимостта на View.

Какви прагове се използват за WindowHeightSizeClass?

За височина на прозореца праговете са различни: Compact — до 480 dp, Medium — 480–900 dp, Expanded — от 900 dp. WindowHeightSizeClass е полезен в пейзажна ориентация и на десктоп.

Резюме

  • Window Size Class — API на Jetpack WindowManager за категоризиране на ширината на прозореца на Compact, Medium и Expanded.
  • Compact — до 600 dp, интерфейс с една колона, Bottom Navigation.
  • Medium — 600–840 dp, интерфейс с две колони, Navigation Rail.
  • Expanded — от 840 dp, интерфейс с множество панели, Navigation Drawer.
  • Jetpack Compose — функция currentWindowAdaptiveInfo() за получаване на класа по време на изпълнение.
  • Material Design 3 — адаптивните компоненти автоматично реагират на Window Size Class.
  • Заключение — Window Size Class заменя традиционната адаптация на breakpoints и прави интерфейсите предвидими на всички устройства.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също