Verwendet setWidth (int Pixel) dip oder px?

95

Verwendet setWidth (int Pixel) geräteunabhängige Pixel oder physikalische Pixel als Einheit? Setzt setWidth (100) beispielsweise die Breite einer Ansicht auf 100 Einbrüche oder 100 Pixel?

Vielen Dank.

user256239
quelle

Antworten:

221

Es werden Pixel verwendet, aber ich bin sicher, Sie fragen sich, wie Sie stattdessen Dips verwenden sollen. Die Antwort ist in TypedValue.applyDimension(). Hier ist ein Beispiel für die Konvertierung von Dips in px im Code:

// 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
quelle
64
Sie können auch nbDips * getResources (). GetDisplayMetrics (). Density
Romain Guy
9
Genau das macht TypedValue.applyDimension (). Ich habe darüber nachgedacht, das zu veröffentlichen, aber ich gehe gerne die API durch, falls sich jemals etwas ändert ... obwohl ich denke, dass es sicher ist, diese Methode zu verwenden, wenn Sie ihr das Okay geben. :)
Dan Lew
12
Die Version applyDimension () führt mehr Code aus und ist etwas schwieriger zu lesen. FWIW, die Zeile, die ich gepostet habe, verwenden wir tatsächlich überall im Framework und in Standard-Apps.
Romain Guy
1
Hallo, ich habe die beiden obigen Beispiele ausprobiert und es scheint die Pixel nicht richtig zu berechnen. Stattdessen wird mir der genaue Wert zurückgegeben, den ich in meiner Ansicht angegeben habe: android: layout_width = "50dip" in meinem Fall. es wird mir 50 den genauen Wert in der XML-Datei zurückgeben. Ich habe dies dann in der App überprüft und wie erwartet ist der Wert falsch und zeichnet die Ansicht zu groß als erwartet
Jonathan
Die einzige Lösung, die ich für die Konvertierung von px in pt gefunden habe, war sehr schön.
A-Live
24

Der richtige Weg, um eine konstante Anzahl von DIPs im Code zu erhalten, besteht darin, eine Ressourcen-XML-Datei zu erstellen, die dp-Werte enthält.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

Verweisen Sie dann wie folgt auf die Ressource in Ihrem Code:

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

Der von Ihnen zurückgegebene Float wird entsprechend der Pixeldichte des Geräts skaliert, sodass Sie keine Konvertierungsmethode in Ihrer gesamten Anwendung replizieren müssen.

SDJMcHattie
quelle
In meiner Situation funktioniert diese Lösung am besten, wenn ich ein benutzerdefiniertes Dialogfeld mit einer Listenansicht habe und die Breite der Kopfzeilenbeschriftungen und Spalten in der Listenansicht auf dieselbe Breite festlegen möchte.
Wayne Phipps
Ihr erster Satz ist ein bisschen lustig, Sie sagen im Grunde, dass das Erstellen einer XML-Datei der richtige Weg ist, um [etwas] im Code anzugeben . Nun, ich denke, Sie verwenden lediglich die Konstante im Code, ohne sie anzugeben :)
Joffrey
@Joffrey ja ich verstehe was du meinst also habe ich den Wortlaut leicht aktualisiert
SDJMcHattie
7

Methode setWidth (100), stellen Sie 100 px als Breite ein (nicht in dp). Daher können auf verschiedenen Android-Handys Probleme mit der Breite auftreten. Verwenden Sie daher die Messung in dp anstelle von Pixeln. Verwenden Sie den folgenden Code, um die Messung in dp der Probenbreite zu erhalten = 300px und Höhe = 400px.

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
quelle
4
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;

Quelle (@Romain Guy)

pomber
quelle
0

Pixel Natürlich fragt die Methode nach Pixeln als Parameter.

Josnidhin
quelle
1
Wenn es in der Layout-XML-Datei ist, können wir android: layout_width = "100dip" oder android: layout_width = "100px" angeben. Im Quellcode können wir die Breite eines Layouts nicht als 100dip angeben.
user256239
Nicht direkt, Sie müssen sich mit DisplayMetrics.density konvertieren.
Romain Guy
0

Basierend auf über Antworten , die gut zu mir funktioniert, habe ich ein paar erzeugen Hilfsmethoden , fügen Sie sie einfach in Ihrem utils sie in ganzen Projekt zu verwenden.

   // 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
quelle