2016-05-06 2 views
2

У меня есть серьезная проблема, над которой я работаю уже несколько дней. Это очень понятно, если сначала взглянуть на это требование. Я изложу свое требование как можно проще в виде точечной формы ниже.Графика для Android: рисование кругов такого же размера

  1. У меня есть 5 телефонов android. 5 различных марок, разные размеры экрана.
  2. Представьте себе размеры экрана 4inch, 4.5inch, 5inch, 5.1inch и 5.2inch
  3. У меня есть приложение для Android и у него есть холст для рисования.
  4. Теперь с использованием canvas.drawCircle(x/2, y/2, radius, paint) Я рисую круг. Представьте себе, что радиус равен 100 (100 пикселей?)
  5. Я устанавливаю это приложение на своем маленьком экране телефона, 4 дюйма. Затем я использую линейку и измеряю диаметр круга. Представьте, что диаметр круга «точный» 3 см.
  6. Теперь я устанавливаю это на других телефонах.
  7. К сожалению, в моем 4,5-дюймовом телефоне диаметр круга составляет 3,2 см. В 5-дюймовом телефоне - 3,3 см. В 5,1-дюймовом телефоне это 2,8 см и так далее.
  8. Однако я хочу, чтобы мой диаметр круга был 3 см (точный 3 см) в каждом телефоне.

Выше требования - это то, что я пытаюсь в течение нескольких дней. Я попробовал следующее, чтобы убедиться, что я получаю круг без изменения размера на всех экранах.

  1. Использование ImageView - Я попытался с помощью ImageView и добавил круг изображение. Я дал ширину, высоту фиксированную. Я попытался установить значения в px, dp, inches и т. Д. Я также пробовал scalling опции для ImageView. Также попытался разместить одно и то же изображение в папке drawable-nodpi. Пробовал создавать доступные папки для всех размеров (например: drawable-mdpi, drawable-hdpi). Не исключено, что изображение было масштабировано.
  2. Использование Canvas - Как объяснялось выше, я попытался использовать холст и нарисовать изображение. Чертежи рисунка.
  3. Поиск пикселей на дюйм .- Пробовал поиск пикселей на дюйм каждого телефона, программно мыслящего, я могу найти способ разработать из него логику, чтобы динамически рисовать изображения одного размера. Я использовал несколько ссылок, включая: Calculate PPI of Android Device. Большинство из них говорят о получении разрешения экрана.

Как я могу выполнить свое требование рисовать круги одинакового размера? Если это можно сделать, зная ИЦП, как мне это сделать?

ответ

0

может быть, это не ответ, но может быть полезным

float _100MmAsPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 
    100/*mm unit set*/, getResources().getDisplayMetrics()); 

выше дает мне 1661.5354 на Nexus 5х и 1889.7638 Nexus 5 (эмулятор). оба имеют fullHD-дисплей, но 5 имеет 4,95 дюйма против 5,2 дюйма в 5 раз.

это означает 100 миллиметров 1662 пикселей на 6 и 1890 по 5x

+0

Таким образом, приведенный выше код предназначен для? –

+0

его изменяющееся целое число с числом 'COMPLEX_UNIT_MM' (миллиметров) на пиксели (всегда). – snachmsm

+0

Я имею в виду пикселы на дюйм? –

0

Ответ до того работал для меня, но до тех пор, как это было не для вас я попытаюсь объяснить то, что я думаю, что это поможет.

У меня есть устройство с плотностью 1 (160 пикселей на дюйм), а показания дисплея сказали мне, что у меня 320 * 480 пикселей, с простыми вычислениями я должен знать свою ширину и высоту мобильного телефона в дюймах : 320/160 = 2 дюйма для ширины, 480/160 = 3. пока все было в порядке, пока я не получил линейку и не измерил ее, и это было неожиданно: у меня 1,65 * 2,48 дюйма !!.

Потом я заметил, что есть нечто, называемое физическое пикселей на дюйм экрана это было облегчением для меня, и вы можете получить его, как это:

getResources().getDisplayMetrics().xdpi; //for width physical dpi 
getResources().getDisplayMetrics().ydpi; //for height physical dpi 

И теперь я могу рассчитать свою физическую ширину и высоту мое устройство, например так:

мои физические точки на дюйм для оба ширины и высоты 193,5238 так ...

320/193,5238 = 1,65 дюймов ширина 480/193,5238 = 2,48 дюймы высоты

И это было правильно !!.

Теперь вернемся к вашей проблеме позволяет получить 3 см в пикселях для любого телефона:

получать ширину в см:

ширина в см = ширина в дюймах * 2,54 (так как 1 дюйм равен 2,54 см)

получает количество пикселей в каждом см:

ширину в пикселях/ширина в см = пикселей на см для ширины (ПВ/см)

н ой вы хотите 3см, то пиксели в соответствии с ней:

3 * Number = 3 см Пиксели

все вышеперечисленное может быть сокращен, как это:

float devicePixelsWidth = getResources().getDisplayMetrics().widthPixels; 
float deviceActualDpi = getResources().getDisplayMetrics().xdpi ; 
float deviceActualInchWidth = devicePixelsWidth/deviceActualDpi ; 
float deviceActualCMWidth = deviceActualInchWidth * 2.54f ; 

float PixelsForActual3CM = devicePixelsWidth/deviceActualCMWidth * 3; 

В конце концов, все вышеупомянутое было проверено и одобрено мной и имеет ту же точность предыдущего метода ответа :)

Смежные вопросы