android - studio - Márgenes de un LinearLayout, mediante programación con dp
layout en android (5)
¿Es posible establecer los márgenes de un LinearLayout, programáticamente pero no con píxeles, pero dp?
El siguiente método me funciona para convertir píxeles a dp:
int pixelToDP(int pixel) {
final float scale = RaditazApplication.getInstance().getResources().getDisplayMetrics().density;
return (int) ((pixel * scale) + 0.5f);
}
Puede convertir dp a px, por ejemplo, convertir 5dp a px:
Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics());
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
Según recuerdo, es mejor usar pisos para compensaciones y redondeos para anchos.
Tuve el mismo problema y usé esta técnica para resolverlo:
Primero, agregué un archivo xml a mi carpeta res / values llamada dimensions.xml. Se parece a esto:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<dimen name="my_margin">5dip</dimen>
</resources>
Segundo, en mi código, obtuve el equivalente en píxeles de ese margen de la siguiente manera (nota que estoy usando Xamarin, así que este es el código C #, pero la versión pura de Java debería ser muy similar):
int myMarginPx = Resources.GetDimensionPixelSize(Resource.Dimension.my_margin);
Finalmente, creo mis parámetros de diseño:
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
layoutParams.SetMargins(myMarginPx, myMarginPx, myMarginPx, myMarginPx);
convertir DP en 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());