Czy setWidth (int pixels) używa niezależnego od urządzenia lub fizycznego piksela jako jednostki? Na przykład, czy setWidth (100) ustawia szerokość widoku na 100 spadków lub 100 pikseli?
Dzięki.
Czy setWidth (int pixels) używa niezależnego od urządzenia lub fizycznego piksela jako jednostki? Na przykład, czy setWidth (100) ustawia szerokość widoku na 100 spadków lub 100 pikseli?
Dzięki.
Odpowiedzi:
Używa pikseli, ale jestem pewien, że zastanawiasz się, jak zamiast tego użyć spadków. Odpowiedź jest dostępna TypedValue.applyDimension()
. Oto przykład, jak przekonwertować spadki na piksele w kodzie:
// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));
Prawidłowym sposobem uzyskania stałej liczby DIPów w kodzie jest utworzenie pliku XML z zasobami zawierającego wartości dp, podobnie jak:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="image_width">100dp</dimen>
<dimen name="image_height">75dp</dimen>
</resources>
Następnie odwołaj się do zasobu w swoim kodzie w następujący sposób:
float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));
Zwrócona liczba zmiennoprzecinkowa zostanie odpowiednio przeskalowana w celu uwzględnienia gęstości pikseli urządzenia, dzięki czemu nie ma potrzeby replikowania metody konwersji w całej aplikacji.
Metoda setWidth (100), ustaw 100 px jako szerokość (nie w dp), więc możesz napotkać problemy o różnej szerokości na różnych telefonach z Androidem.Więc użyj pomiaru w dp zamiast w pikselach Użyj poniższego kodu, aby uzyskać pomiar w dp szerokości próbki = 300 pikseli, a wysokość = 400 pikseli.
int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());
int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;
Piksele oczywiście metoda prosi o piksele jako parametr.
Na podstawie powyższych odpowiedzi, które dla mnie działają dobrze, generuję kilka metod pomocniczych , po prostu dodaj je do twoich narzędzi, aby używać ich w całym projekcie.
// value in DP
public static int getValueInDP(Context context, int value){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
}
public static float getValueInDP(Context context, float value){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
}
// value in PX
public static int getValueInPixel(Context context, int value){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
}
public static float getValueInPixel(Context context, float value){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
}