Как да нарисувате кръг с еднакъв физически размер на различни устройства с 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 (кожа=1024x768, плътност=160):

Устройство 3

За всяко устройство маркирах опцията Scale display to real size при стартиране и използвах същите настройки (размер на екрана = 3,7 инча, dpi на монитора = 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