Winrt, проблеми дозволу екрану і масштабування

WinRT --- Проблеми дозволу екрану і масштабування

Більшість додатків Windows 8 будується на основі примірників класу Page. Звичайно, це не є обов'язковою вимогою, але надає деякі зручності, наприклад спрощену інтеграцію рядків додатків. До цієї статті розглядалися тільки програми, що мають єдиний екземпляр класу, похідного від Page, з ім'ям MainPage. Пора зайнятися програмами, що підтримують багатосторінкову навігацію в стилі веб-додатків.

У Visual Studio входять два шаблони проектів багатосторінкових додатків - Grid App та Split App. Ці шаблони будуються на базі потужних елементів управління ListView і GridView і використовують їх в моделях уявлень. Ці шаблони також реагують на зміни орієнтації екрану і режиму Snap View, так що ця і наступні статті стануть гарною відправною точкою для вивчення проблем, пов'язаних зі зміною розмірів вікна.

Обробка зміни розмірів вікна - завдання, добре знайома Windows-програмістам. У більшості традиційних настільних Windows-програм є рамка зміни розмірів, за допомогою якої користувач може управляти розміром і пропорціями вікна програми. Windows-програмістів 25 років вчили писати програми, адаптуються до розміру вікна, заданої користувачем. Звичайно, це можливо не завжди: що повинна робити електронна таблиця, якщо користувач зменшить вікно так, що не залишиться жодної видимої осередку? Деякі програми - наприклад, Калькулятор - просто встановлюють фіксований розмір вікна, достатній для відображення всього вмісту програми. Для традиційних настільних додатків таке рішення прийнятно тільки в тому випадку, якщо вікно свідомо занадто мале.

Додатки Windows 8 в основному працюють в повноекранному режимі, і проблема мінімального розміру екрану для них менш актуальна. Однак додатки Windows 8 також схильні до змін орієнтації екрану і включенню Snap View, і багато додатків повинні обробляти такі зміни.

Проблеми дозволу екрану

Екран комп'ютера має фіксований горизонтальний і вертикальний розмір в пікселах, а також фізичний розмір, який зазвичай задається як величина діагоналі в дюймах. Знаючи ці розміри, по теоремі Піфагора можна обчислити дозвіл в пікселах на дюйм (ця одиниця також позначається скороченням DPI - Dots Per Inch).

Наприклад, діагональ екрану з розмірами 1024 x 768 пікселів дорівнює 1280 пікселів. Якщо фізичний розмір діагоналі становить 12 дюймів, то роздільна здатність становить 106 DPI. Діагональ 23-дюймового настільного монітора зі стандартним режимом високого роздільної здатності 1920 x 1080 пікселів містить близько 2203 пікселів з дозволом 96 DPI. У 27-дюймового монітора з екраном 2560 x 1440 пікселів дозвіл близько 109 DPI.

Раніше я говорив, що дозвіл екрана можна вважати рівним 96 пикселам на дюйм. Як бачите, ця оцінка непогано підходить для трьох моніторів з наведеного прикладу, хоча вам можуть зустрітися монітори, для яких це правило помітно спотворено: при роботі я використовував планшет Samsung з розміром екрану 1366 x 768 і діагоналлю 11,6 дюйма з роздільною здатністю 135 DPI. Якщо намалювати на цьому екрані квадрат зі стороною 96 пікселів, то замість дюйма довжина сторони складе близько 0,7 дюйма.

Припущення про дозвіл 96 DPI найчастіше порушується для малих екранів з великою кількістю пікселів. Для прикладу візьмемо екран з діагоналлю 10,6 дюйма і розміром 1920 x 1080 пікселів. Дозвіл такого екрану складає 208 DPI; відповідно дюймовий (на думку програміста) об'єкт буде займати на ньому менше половини дюйма. Текст зменшується, і хоча його все ще можна прочитати через високої щільності пікселів, виконувати з ним операції на сенсорному екрані вже незручно.

З цієї причини Windows 8 намагається компенсувати високий дозвіл екрана способом, щодо прозорим для додатків: якщо розмір екрану в пікселях становить 2560 x 1440 і вище, а фізичний розмір, припустимо, дорівнює 12 дюймам (що дає дозвіл 240 DPI і вище), Windows змінює координати в пікселях і розміри, які використовуються в додатку, на 180%. З точки зору програми екран 2560 x 1440 має розмір 1422 x 800 пікселів.

Якщо екран не володіє такою високою щільністю пікселів, але володіє розміром не менше 1920 x 1080, а фізичний розмір досить малий для забезпечення дозволу 174 DPI і вище, Windows 8 змінює все розміри в пікселах на 140%; таким чином, екран 1920 x 1080 з точки зору програми має розмір 1371 x 771 пікселів.

Пам'ятайте, що всі ці автоматичні коригування застосовуються тільки для фізично малих екранів з великою кількістю пікселів. Фізично великий екран з фактичним дозволом нижче 174 DPI змінюватися не буде, а отже, додаток буде «бачити» його повний розмір.

У Windows Runtime передбачуване дозвіл екрана називається логічним дозволом (logical DPI). Зазвичай логічне дозвіл одно 96, але для екранів з великою щільністю пікселів воно може становити 134,4 (96 DPI, помножене на 140%) або 172,8 (96 DPI, помножене на 180%).

Давайте подивимося, як працює ця система. Програма WhatRes схожа на програму WhatSize, представлену в статті Події зміни розміру і орієнтації в WinRT. але крім розміру вікна (який збігається з розміром сторінки) вона отримує інформацію про дозвіл екрана.

Файл XAML в проекті WhatRes просто створює екземпляр TextBlock:

Файл фонового коду призначає обробники для події SizeChanged сторінки, а також для статичного події LogicalDpiChanged класу DisplayProperties, визначеного в просторі імен Windows.Graphics.Display:

У реальному додатку подія DisplayProperties.LogicalDpiChanged буде ініціюватися досить рідко, тому що розмір екрану в пікселях або його фізичний розмір зазвичай не змінюються під час виконання програми. Втім, подія може бути ініційовано при підключенні до комп'ютера з Windows 8 другого монітора, що має інше логічне дозвіл, і переміщенні програми з одного монітора на інший.

Програма WhatRes спочатку отримує розмір вікна з властивостей ActualWidth і ActualHeight сторінки, а потім обчислює фактичний розмір в пікселах за даними DisplayProperties.LogicalDpi.

Програма WhatRes добре підходить для запуску в емуляторі Windows 8, який можна вибрати на стандартній панелі інструментів Visual Studio. Емулятор дозволяє запускати додаток з деякими поширеними розмірами екранів. Наприклад ось як виглядає WhatRes на імітованому екрані 1920 х 1080 з діагоналлю 10,6 дюйма:

Winrt, проблеми дозволу екрану і масштабування

Для програми Windows 8 вікно має розмір тисячі триста сімдесят одна х 771, і весь відображається в ньому текст і графіка базуються на цьому розмірі. Обчислений розмір в пікселах збігається з розміром екрану в пікселях. Як бачите, шрифт з розміром 18 пунктів займає ту ж відносну площу, як і на екрані 1366 х 768.

проблеми масштабування

Windows-програмісти звикли працювати з координатами і розмірами в пікселях. Коли програма виконується на фізично малому екрані з високою щільністю пікселів, Windows масштабує ці координати і розміри в залежності від розміру і дозволу екрану.

У першому стовпці такої таблиці наведені деякі значення в DIU, використовувані при малюванні і визначенні розмірів, а в інших стовпцях показано, як ці значення перетворюються в безпосередні пікселі на екрані: