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.
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.
Antworten:
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()));
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.
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());
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;
Pixel Natürlich fragt die Methode nach Pixeln als Parameter.
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());
}