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

Я определил размер радиуса круга в файле ресурсов следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="circleRadius">15dp</dimen>
</resources>

И затем я рисую круг в пользовательском представлении следующим образом:

Resources res = getResources();
float radius = res.getDimension(R.dimen.circleRadius);

...

canvas.drawCircle(randomX, randomY, radius, paint);

У меня сложилось впечатление, что это создаст круг одинакового физического размера на любом устройстве, потому что единицы измерения указаны в dp, но это не так. Смотрите скриншоты ниже.

Устройство 1 (кожа = WVGA800, плотность = 240):

Устройство 1

Устройство 2 (оболочка = QVGA, плотность = 120):

Устройство 2

Устройство 3 (скин = 1024 x 768, плотность = 160):

Устройство 3

Для каждого устройства я отметил опцию Scale display to real size при запуске и использовал те же настройки (размер экрана = 3,7 дюйма, разрешение монитора = 105). Это где я ошибся? Я что-то не понимаю?


person XåpplI'-I0llwlg'I -    schedule 19.11.2012    source источник


Ответы (2)


У вас просто сложилось неправильное впечатление. Чтобы сравнить, как вы это делаете, вам нужно нормализовать вывод. Возьмите все скриншоты и масштабируйте их до одинаковой плотности и разрешения. Затем снова сравните.

ИЗМЕНИТЬ

Если вы хотите показать круг диаметром 1 дюйм, несмотря на оборудование, вы должны использовать не dp, а in или pt единицу измерения. См. документы: http://developer.android.com/guide/topics/resources/more-resources.html#Dimension

person Marcin Orlowski    schedule 19.11.2012
comment
Тогда как нарисовать круг одинакового физического размера на любом устройстве? - person XåpplI'-I0llwlg'I -; 19.11.2012
comment
Размер экрана различается по физическому размеру и размеру экрана. Вы никогда не получите точно такие же, если попытаетесь измерить линейкой. Чего именно вы хотите добиться? - person Marcin Orlowski; 19.11.2012
comment
Я хочу нарисовать круг одинакового физического размера (например, радиусом 1 дюйм) на любом устройстве. Аналогично в этом примере. - person XåpplI'-I0llwlg'I -; 19.11.2012
comment
Хорошо, я попробовал с pt, но круги все еще имеют разные размеры на разных устройствах... Я должен оставить опцию Scale display to real size не отмеченной? - person XåpplI'-I0llwlg'I -; 19.11.2012

Использовать:

//get dots per inch

int dpi = getApplicationContext().getResources().getDisplayMetrics().densityDpi;

//the physical size you want in inches

float x = 0.25f;

//get number of dots for that physical size

final float radius = x*(new Float(dpi));

//now you use radius in drawCircle() method
person joyx    schedule 27.10.2015