LinearLayout的边距,用dp编程

是否有可能设置一个LinearLayout的边距,以编程方式但不是像素,但dp?

您可以使用DisplayMetrics并确定屏幕密度。 像这样的东西:

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

正如我记得,最好使用地板偏移和宽度的圆化。

我有同样的问题,并使用这种技术来解决它:

首先,我将一个xml文件添加到我的res / values文件夹(名为dimensions.xml)中。 它看起来像这样:

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

其次,在我的代码中,我得到的像素相当于边距如下(注意我使用Xamarin,所以这是C#代码,但纯Java版本应该是非常相似的):

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

最后,我创build了我的布局参数:

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

您可以将dp转换为px,例如将5dp转换为px:

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

以下方法适用于将像素转换为dp:

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

将DP转换为像素值

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