Czy setWidth (int piksele) używa dip lub px?

Odpowiedzi:

222

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()));
Dan Lew
źródło
64
Możesz także wywołać nbDips * getResources (). GetDisplayMetrics (). Density
Romain Guy
9
W rzeczywistości dokładnie to robi TypedValue.applyDimension (). Rozważałem opublikowanie tego, ale lubię przeglądać interfejs API na wypadek, gdyby coś się zmieniło ... chociaż myślę, że użycie tej metody jest bezpieczne, jeśli wyrazisz na to zgodę. :)
Dan Lew
12
Wersja applyDimension () wykonuje więcej kodu i jest nieco trudniejsza do odczytania. FWIW, opublikowana przeze mnie linia jest tym, czego faktycznie używamy wszędzie w ramach i standardowych aplikacjach.
Romain Guy
1
Cześć, wypróbowałem powyższe dwa przykłady i nie wydaje się, aby poprawnie obliczał piksele. zamiast tego zwraca mi dokładną wartość, którą określam w moim widoku: android: layout_width = "50dip" w moim przypadku. zwróci mi to dokładną wartość w pliku xml. następnie sprawdziłem to w aplikacji i zgodnie z oczekiwaniami wartość jest nieprawidłowa i rysuje widok zbyt duży niż oczekiwano
Jonathan
Jedyne rozwiązanie jakie znalazłem dla konwersji px na pt, bardzo ładne.
A-Live
24

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.

SDJMcHattie
źródło
W mojej sytuacji to rozwiązanie działa najlepiej, gdy mam niestandardowe okno dialogowe, które ma widok listy i chce ustawić szerokość etykiet nagłówka i kolumn w widoku ListView na tę samą szerokość.
Wayne Phipps
Twoje pierwsze zdanie jest trochę zabawne, w zasadzie mówisz, że utworzenie pliku XML to właściwy sposób na „określenie [czegoś] w kodzie” . Cóż, myślę, że po prostu używasz stałej w kodzie, nie określając jej :)
Joffrey
@Joffrey tak, rozumiem, co masz na myśli, więc nieznacznie zaktualizowałem sformułowanie
SDJMcHattie
7

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());
Nidhin
źródło
4
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;

Źródło (@Romain Guy)

pomber
źródło
0

Piksele oczywiście metoda prosi o piksele jako parametr.

Josnidhin
źródło
1
Jeśli jest w pliku XML układu, możemy określić android: layout_width = "100dip" lub android: layout_width = "100px". W kodzie źródłowym nie możemy określić szerokości układu jako 100dip?
user256239
Nie bezpośrednio, musisz przekonwertować się za pomocą DisplayMetrics.density.
Romain Guy
0

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());
    }
Abhishek Garg
źródło