• 0
Brovin Yaroslav

Получаем разрешение экрана устройства, логические и физические размеры экрана в FireMonkey

Вопросы

Введение
Появление экранов повышенной плотность физических точек, привело с одной стороны к проблеме адаптации графического интерфейса под разные разрешения экранов при их одинаковых физических размерах, с другой к увеличению четкости и качества картинки.
 
Например, если раньше на iPhone 3 при размере экрана 3,5 дюйма позволял отобразить 320х480 точек, то на устройстве iPhone 4 при таком же физическом размере экрана, экран мог уже отображать 640х960 точек. Это хорошо видно на увеличенном изображении обычного экрана и ретина экрана на рисунке ниже (слева - не ретина, справа - ретина (2х)). Справа количество физических точек ровно в четыре раза больше, чем слева:

post-1-0-74189600-1389534642_thumb.jpg

 

Для разработчика это могло означать, что интерфейс привязанный к разрешению 320х480 на Retina экране будет занимать только четверть экрана. Естественно, что использование разрешения экрана в физических координатах не удобно с этой точки зрения. Именно по этому появились логические координаты, которые гарантируют, что тот же пользовательский интерфейс для iPhone 3, будет иметь такие же размеры (физические) и на экране с ретиной.
 
FireMonkey работает в логических координатах. Это означает, что на iPhone 3 - 4 мы работаем с логическим разрешением 320x480 точек. Однако, при отображении интерфейса на iPhone 4 c (с двойной плотностью пикселей по сравнению с iPhone 3), интерфейс автоматически масштабируется на физическое разрешение 640х960 с коэффициентом масштабирования равным 2. 
 
Практика
Теперь посмотрим, как получить всю эту информацию. Вся информация об экране (логический размер и коэффициент масштабирования) находится в сервисе IFMXScreenService
Чтобы получить физическое разрешение экрана, нужно логический размер умножить на коэффициент масштабирования.
 
Код ниже показывает, как получить доступ к этому сервису и извлечь требуемые параметры:

var
  ScreenService: IFMXScreenService;
  LogicScreenSize: TPoint;
  ScreenScale: Single;
begin
  // Запрашиваем сервис экрана, для получения информации о размере и текущем коэффициенте масштабирования
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
  begin
    LogicScreenSize := ScreenService.GetScreenSize.Round;
    ScreenScale := ScreenService.GetScreenScale;
    LabelLogicScreenSize.Text := Format('Логический размер: %d, %d', [LogicScreenSize.X, LogicScreenSize.Y]);
    LabelPhysicScreenSize.Text := Format('Физический размер: %f, %f', [LogicScreenSize.X * ScreenScale, LogicScreenSize.Y * ScreenScale]);
    LabelScreenScale.Text := Format('Коэффициент масштабирования: %f',[ScreenService.GetScreenScale]);
  end;
end;

Результат кода приведен на снимке экранов ниже для iPad устройств с ретиной экраном и без:

post-1-0-39187900-1389534641_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 ответа на этот вопрос

Гость
Эта тема закрыта для публикации ответов.