Пытаюсь перенести какой-то старый код и не знаю, как перевести размер экрана, который должен быть определен в дюймах, в единицы измерения, которые использует 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. В качестве альтернативы, если нет никаких указаний относительно того, что я ищу, есть ли хороший простой кросс-платформенный способ узнать, каковы физические размеры экрана устройства, который я мог бы использовать, чтобы лучше свести эти соотношения?
2340/440 = 5,31818..." в высоту 1080/440 = 2,4545..." в ширину
Это способ использования DPI для расчета высоты и ширины. Обычно производители мобильных телефонов рассчитывают плотность пикселей с помощью PPI.
Если вам нужно преобразовать размеры пикселей в PPI, вы можете использовать формулу. Он обеспечивает как автоматическое преобразование, так и формулу вручную. Формула:
PPI = Diagonal In Pixels / Diagonal In Inches
Чтобы вычислить диагональ в пикселях, используйте:
Diagonal In Pixels = √(width² + height²)
Я провел расчеты в вашем посте и могу подтвердить, что ppi составляет ~ 440. Диагональ в дюймах: 5,860034129593445, Диагональ в пикселях: 2577,207791389744, PPI = 439,7939899999429. 440/2,75 (Плотность) = 160 единиц на дюйм. Ширина 320 = 2 дюйма, куда делись остальные полдюйма?
Немного покопавшись, я обнаружил, что причина несоответствия на самом деле кроется в файле AndroidManifest.xml. Мне пришлось просмотреть необработанный XML-файл, а не редактор, и я нашел эту подозрительно выглядящую строку, которая в конечном итоге стала причиной исправления ширины:
<supports-screens android:largestWidthLimitDp = "320" />
Проблема, с которой я столкнулся, больше связана с переводом в единицы отображения MAUI (которые не измеряются в PPI). Кажется, что ничто в отношении PPI/Density не соответствует полноэкранной ширине в 320 единиц; Я не знаю, как ширина 1080 пикселей переводится в ширину 320 единиц. 1080 является точным, а разрешение 440 точек на дюйм является точным, и я знаю, что ширина устройства составляет ~ 2,5 дюйма. Чего я не знаю, так это того, как любое из этих чисел связано с шириной 320 единиц.