2011-02-06 21 views

Respuesta

109

Puede usar DisplayMetrics y determinar la densidad de la pantalla. Algo como esto:

int dpValue = 5; // margin in dips 
float d = context.getResources().getDisplayMetrics().density; 
int margin = (int)(dpValue * d); // margin in pixels 

Como recuerdo, es mejor usar pisos para compensaciones y redondeos para anchos.

+0

simplemente como un comentario: también puede utilizar TypedValue.applyDimensions(), pero parece que esta forma es mejor, ver http://stackoverflow.com/questions/2406449/does-setwidthint-pixels-use-dip-or-px/2406790#2406790 (Romain Guy es un ingeniero de Android) – bigstones

+0

+1 - I Tengo un par de widgets que construí en código (sin usar XML), y solo puedes establecer píxeles allí. Tan pronto como especifiqué la versión SDK, mis diseños se volvieron locos. Utilicé esto para arreglarlos ... ¡Siempre use XML para diseños de Android! – tpow

+3

Gran fragmento. De Verdad. –

12

que tenían el mismo problema y se utiliza esta técnica para resolverlo:

En primer lugar, he añadido un archivo XML para mis res/valores carpeta llamada dimensions.xml. Se ve así:

<?xml version="1.0" encoding="utf-8" ?> 
<resources> 
    <dimen name="my_margin">5dip</dimen> 
</resources> 

En segundo lugar, en mi código, que tiene el equivalente de píxeles de ese margen de la siguiente manera (en cuenta que estoy usando Xamarin por lo que este es el código C#, pero la versión de Java puro debe ser muy similar):

int myMarginPx = Resources.GetDimensionPixelSize(Resource.Dimension.my_margin); 

por último, creo mi params de Presentación:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent); 
layoutParams.SetMargins(myMarginPx, myMarginPx, myMarginPx, myMarginPx); 
+0

Amigo, muchas gracias, Este código me ayuda. –

+0

en forma de android java, debería ser como: 'int getDimenInt (Context context, @DimenRes int dimenRes) { return context.getResources(). GetDimensionPixelSize (dimenRes); } ' –

7

puede convertir a dp px, por ejemplo, convertir a 5 dp px:

Resources r = mContext.getResources(); 
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics()); 
3

El siguiente método funciona para mí para convertir píxeles a dp:

int pixelToDP(int pixel) { 
    final float scale = RaditazApplication.getInstance().getResources().getDisplayMetrics().density; 
    return (int) ((pixel * scale) + 0.5f); 
} 
1

convertir DP al valor de píxel

int Whatever_valueInDP=10;//value in dp 
int Value_In_Pixel= (int) TypedValue.applyDimension(
      TypedValue.COMPLEX_UNIT_DIP, Whatever_valueInDP, getResources() 
        .getDisplayMetrics()); 
Cuestiones relacionadas