Chcę narysować tekst o określonej wysokości (w pikselach) w widoku przy użyciu Canvas
. Czy możesz po prostu użyć Paint.setTextSize(float)
z liczbą pikseli, czy to przy użyciu dp
lub sp
?Której jednostki miary używa Paint.setTextSize (float)?
Odpowiedz
Wykorzystuje pikseli, ale można przekonwertować go DP przy użyciu tego kodu:
double getDPFromPixels(double pixels) {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
switch(metrics.densityDpi){
case DisplayMetrics.DENSITY_LOW:
pixels = pixels * 0.75;
break;
case DisplayMetrics.DENSITY_MEDIUM:
//pixels = pixels * 1;
break;
case DisplayMetrics.DENSITY_HIGH:
pixels = pixels * 1.5;
break;
}
return pixels;
}
Te metody obejmują DisplayMetrics
, który można dodać do przyszłego SDK Androida.
Piksele zanurzyć:
public static float getDipFromPixels(float px) {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_PX,
px,
Resources.getSystem().getDisplayMetrics()
);
}
Dip do pikseli:
public static float getPixelsFromDip(float dip) {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dip,
Resources.getSystem().getDisplayMetrics()
);
}
Najłatwiej dostać px wartość takich metod jest po prostu zdefiniować odpowiedni DP lub wartości SP w tych dimens .xml plik i pobrać go tak:
int sizeInPx = context.getResources().getDimensionPixelSize(R.dimen.sizeInSp);
rzeczywiście mieć 3 metody dostępne do wykorzystania w zależności od twoje potrzeby:
getDimension()
Zwraca wartość zmiennoprzecinkową w pikselach.Zwraca liczbę int w pikselach. Jest to to samo, co getDimension(), z tym że zwracana wartość jest ZAZNANA do najbliższej liczby całkowitej i zapewnia, że niezerowa wartość wejściowa daje zerową wartość wyjściową (np. Wartość 0,1 jest zwracana jako 1, a nie 0).
getDimensionPixelOffset()
Zwraca liczbę int w pikselach. Jest to to samo co getDimension(), z wyjątkiem zwracanej wartości TRUNCATED (tj. Zaokrąglone w dół). Wynik może wynosić zero.
To jest najlepsza odpowiedź; działa poprawnie na wszystkich istniejących urządzeniach i będzie kontynuował pracę nad przyszłymi urządzeniami (odpowiedź Todd Davies nie zawiera nowszych gęstości, takich jak xhdpi, xxhdpi itd.). Jest to również bardziej elastyczne, możesz podać alternatywny plik dimens.xml dla różnych rozmiarów ekranu (tablety itp.) Lub w razie potrzeby zmienić między dp i sp. – NaxyMatt
Tak, ta odpowiedź TheIT jest najlepszą odpowiedzią, jak mówi WanderingLinguist, ponieważ rozwiązanie Todda Daviesa powinno zostać zaktualizowane, tak aby obejmowało również przypadki xHigh, xxhigh i xxxhigh i tv, a także, które przypadki pojawią się w przyszłości, pokazując, że jest on skomplikowany i będzie łatwo zepsuty, zamiast tego odpowiedzi TheIT, która będzie działać teraz iw przyszłości, nawet jeśli kiedykolwiek pojawią się urządzenia, a rozwiązanie będzie działać tak, jak Android planuje obsłużyć wszystkie urządzenia typu "king". –
Dziękuję za odpowiedź tak szybko. – marzipankaiser
@ Todd Davies - jak używać tego w niestandardowej klasie widoku? Nie można użyć getWindowManager() – Neil
@Neil - Możesz użyć metody View 'getContext()', aby uzyskać 'Context', po czym możesz wywołać' Context.getSystemService (Context.WINDOW_SERVICE) 'aby uzyskać' WindowManager'. Więcej na ten temat tutaj http://developer.android.com/reference/android/view/WindowManager.html. – Tzoiker