• 0
Viacheslav

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

Вопросы

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

 

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

 

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

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


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

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

  • 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.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

    • От 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 пользователей онлайн

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