Перейти к содержанию
  • Регистрация
  • 0
Viacheslav

Как в программе определить физические размеры экрана устройства?

Вопрос

Как в программе определить физические размеры экрана устройства? Это необходимо для корректного масштабирования элементов управления под пальцевое управление. В этой теме информация только про разрешение в пикселях, но нет ничего про физические размеры экрана (в метрах/миллиметрах/дюймах) или dpi.

 

Если нет универсального способа, то подскажите хотя бы платформозависимые для iOS и Android.

 

Для iPhone определить размеры экрана хоть как-то можно по размеру экрана в пискелях. Их всего несколько вариантов. Хотя это решение не поддерживает будущих устройств. А что делать с Android?

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


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

Рекомендуемые сообщения

  • 0

DPI для Android

 
uses
  FMX.Helpers.Android, Androidapi.JNI.Util;

procedure TForm1.Button1Click(Sender: TObject);
var
  Disp: JDisplayMetrics;
  NativeClientHeight, NativeClientWidth: Single;
begin
   Disp := GetJDisplayMetrics;
   NativeClientWidth := ClientWidth * Disp.density;
   NativeClientHeight := ClientHeight * Disp.density;
   //Label1.Text := 'Width: ' + FloatToStr(NativeClientWidth);
   //Label2.Text := 'Height: ' + FloatToStr(NativeClientHeight);
   Label1.Text := FloatToStr( Disp.xdpi );
   Label2.Text := FloatToStr( Disp.ydpi );
   Label3.Text := IntToStr( Disp.densityDpi );
end;

 
Для IOS облом, рассчитывай сам http://www.dpi.nu/http://www.sven.de/dpi/http://www.pxcalc.com/http://www.pixelcalculator.com/ и т.п.

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


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

Я сделал на много проще. Добавил layout и задал ему alingn:=alClient; и использую его значения высоты и ширины

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


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

Доброго времени суток.

Аналогичная проблема: ругается на Disp := GetJDisplayMetrics в XE8. Просьба помочь, кто обладает информацией на сей счет, или как еще можно определить кол-во пикселей на единицу, дабы рассчитать физ. размер экрана в этих самых единицах?

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 26.05.2014 в 16:02, estra сказал:

DPI для Android

 

uses
  FMX.Helpers.Android, Androidapi.JNI.Util;

procedure TForm1.Button1Click(Sender: TObject);
var
  Disp: JDisplayMetrics;
  NativeClientHeight, NativeClientWidth: Single;
begin
   Disp := GetJDisplayMetrics;
   NativeClientWidth := ClientWidth * Disp.density;
   NativeClientHeight := ClientHeight * Disp.density;
   //Label1.Text := 'Width: ' + FloatToStr(NativeClientWidth);
   //Label2.Text := 'Height: ' + FloatToStr(NativeClientHeight);
   Label1.Text := FloatToStr( Disp.xdpi );
   Label2.Text := FloatToStr( Disp.ydpi );
   Label3.Text := IntToStr( Disp.densityDpi );
end;
 
Для IOS облом, рассчитывай сам http://www.dpi.nu/http://www.sven.de/dpi/http://www.pxcalc.com/http://www.pixelcalculator.com/ и т.п.

у меня тоже ругается на строчку Disp := GetJDisplayMetrics.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Android/iOS
var
   clientScreenScale   : Single;
   clientScreenSize    : TSize;
   clientScreenService : IFMXScreenService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(clientScreenService)) then
    clientScreenScale := clientScreenService.GetScreenScale
  else
    clientScreenScale := 1;

  // The display device's width:
  clientScreenSize.CX := Round(clientScreenService.GetScreenSize.X * clientScreenScale);
  // The display device's height:
  clientScreenSize.CY := Round(clientScreenService.GetScreenSize.Y * clientScreenScale);
end;

 

Изменено пользователем ENERGY

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Platon
      Во-первых, почему формы и компоненты не измеряются в dp?
      Эта верстка под различные экраны просто мука. Я до сих пор не понимаю как это все определяется на устройствах. Запускаю эмуляторы с диагональю 3,7, но форма включается для диагоналей 4. 
      Как вы делаете форму универсальной? Программно? Если да, то подскажите как это сделать.
    • От Andrey Efimov
      Здравствуйте.
      Возник вопрос, какого размера должны быть иконки в приложении, чтобы оно выглядело одинаково на разных разрешениях/устройствах?
       
      Вопрос вроде не сложный, но я что-то запутался…
       
      Читал http://developer.android.com/design/style/iconography.html, но так и не понял какой размер использовать для иконок.
       
      Пример ситуации: Нам нужно добавить иконку к пункту в ListBox’е, так чтобы иконка одинаково смотрелась на разных разрешениях экрана.
       
      Из статьи я понял, что иконки могут быть:
      MDPI: 32x32 HDPI: 48x48 XHDPI: 64x64 XXHDPI: 96x96 Но все 4-и вида запихнуть в один листбокситем нельзя. Поэтому и возник вопрос.
       
      Я пришёл к выводу, что лучше использовать для иконки xxhdpi: 96x96, т.е. максимальный размер, предположив, что на большом или маленьком разрешении она будет ресайзиться сама. Правильно ли я всё понял? Если да, то тогда я не понимаю зачем делать(в том числе и гугл) 4-е вида иконок, если можно сделать одну xxhdpi: 96x96.
       
      P.S. Очень нужно понять это, т.к. для приложения, которое я пишу, нужно нарисовать иконки (делаю это впервые). Жаль, что гугл даёт так мало стандартных иконок и в паке нет даже простейшей иконки файла.
      P.S.2 Решил использовать пока HDPI: 48x48 (http://developer.android.com/design/style/metrics-grids.html)
    • От Brovin Yaroslav
      Введение
      Появление экранов повышенной плотность физических точек, привело с одной стороны к проблеме адаптации графического интерфейса под разные разрешения экранов при их одинаковых физических размерах, с другой к увеличению четкости и качества картинки.
       
      Например, если раньше на iPhone 3 при размере экрана 3,5 дюйма позволял отобразить 320х480 точек, то на устройстве iPhone 4 при таком же физическом размере экрана, экран мог уже отображать 640х960 точек. Это хорошо видно на увеличенном изображении обычного экрана и ретина экрана на рисунке ниже (слева - не ретина, справа - ретина (2х)). Справа количество физических точек ровно в четыре раза больше, чем слева:

       
      Для разработчика это могло означать, что интерфейс привязанный к разрешению 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 устройств с ретиной экраном и без:

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...