.NET MAUI: как спрогнозировать/рассчитать ширину и высоту относительно физического размера экрана?

Пытаюсь перенести какой-то старый код и не знаю, как перевести размер экрана, который должен быть определен в дюймах, в единицы измерения, которые использует MAUI. Кажется, что свойств DisplayInfo и Width и Height мне недостаточно, чтобы вычислить, какие фактические единицы ширины/высоты отображаются на полноэкранной странице, и я не уверен, как именно рассчитываются единицы?

Кажется, что в MAUI может быть мало документации, связанной с этим, документы Xamarin все еще актуальны (как предполагает этот старый ответ )? Трудно понять, как много изменилось, и я могу где-то ошибаться в математических расчетах, но если я возьму документацию , которая ссылается на, вместе с моим не совсем точным для устройства эмулятором «Pixel 5» с разрешением 1080x2340 и При DPI 440 цифры получаются не совсем корректными. Я повозился, учитывая следующие измерения:

DeviceDisplay.Current.MainDisplayInfo.Height: 2340
DeviceDisplay.Current.MainDisplayInfo.Width: 1080
DeviceDisplay.Current.MainDisplayInfo.Density: 2.75

2.75 * 160 = 440dpi, so the density seems to match the docs
2340 / 440 = 5.31818..." tall
1080 / 440 = 2.4545..." wide 
5.31818..." * 160dps = 850.9090...dps, should be the full height of the display
2.4545..." * 160dps = 392.7272...dps, should be the full width of the display

но мои наблюдения не оправдали моих ожиданий, поэтому я добавил Density на стартовую страницу почти полной высоты (ожидая, что что-то чуть меньше 850 выше, оставляя место для панелей уведомлений/действий) и записал фактическую ширину/высоту который показал:

OnSizeAllocated, width: 320, height: 654.1818181818181

Таким образом, исходя из этих измерений, кажется, что ширина экрана составляет всего 2 дюйма, а высота воспринимается как 4 дюйма. Я понятия не имею, как предсказать/вычислить эти, казалось бы, произвольные различия из документов (Xamarin). Изменил ли MAUI поведение? Есть ли фактор, который я не принимаю во внимание?

Допустим, я хотел указать, что максимальная ширина чего-либо должна составлять 2,5 дюйма, или изменить высоту чего-либо, если экран выше 5 дюймов. Как мне это выразить (желательно на C#, поскольку это приложение не использует XAML)? Если это имеет значение, мне нужно, чтобы это работало только для iOS и Android. В качестве альтернативы, если нет никаких указаний относительно того, что я ищу, есть ли хороший простой кросс-платформенный способ узнать, каковы физические размеры экрана устройства, который я мог бы использовать, чтобы лучше свести эти соотношения?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
227
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

2340/440 = 5,31818..." в высоту 1080/440 = 2,4545..." в ширину

Это способ использования DPI для расчета высоты и ширины. Обычно производители мобильных телефонов рассчитывают плотность пикселей с помощью PPI.

Если вам нужно преобразовать размеры пикселей в PPI, вы можете использовать формулу. Он обеспечивает как автоматическое преобразование, так и формулу вручную. Формула:

PPI = Diagonal In Pixels / Diagonal In Inches

Чтобы вычислить диагональ в пикселях, используйте:

Diagonal In Pixels = √(width² + height²)

Проблема, с которой я столкнулся, больше связана с переводом в единицы отображения MAUI (которые не измеряются в PPI). Кажется, что ничто в отношении PPI/Density не соответствует полноэкранной ширине в 320 единиц; Я не знаю, как ширина 1080 пикселей переводится в ширину 320 единиц. 1080 является точным, а разрешение 440 точек на дюйм является точным, и я знаю, что ширина устройства составляет ~ 2,5 дюйма. Чего я не знаю, так это того, как любое из этих чисел связано с шириной 320 единиц.

TheXenocide 25.04.2024 17:35

Я провел расчеты в вашем посте и могу подтвердить, что ppi составляет ~ 440. Диагональ в дюймах: 5,860034129593445, Диагональ в пикселях: 2577,207791389744, PPI = 439,7939899999429. 440/2,75 (Плотность) = 160 единиц на дюйм. Ширина 320 = 2 дюйма, куда делись остальные полдюйма?

TheXenocide 25.04.2024 17:41
Ответ принят как подходящий

Немного покопавшись, я обнаружил, что причина несоответствия на самом деле кроется в файле AndroidManifest.xml. Мне пришлось просмотреть необработанный XML-файл, а не редактор, и я нашел эту подозрительно выглядящую строку, которая в конечном итоге стала причиной исправления ширины:

<supports-screens android:largestWidthLimitDp = "320" />

Другие вопросы по теме