【发布时间】:2011-06-22 07:00:07
【问题描述】:
是否可以通过编程方式设置 LinearLayout 的边距,但不是像素,而是 dp?
【问题讨论】:
标签: android
是否可以通过编程方式设置 LinearLayout 的边距,但不是像素,而是 dp?
【问题讨论】:
标签: android
您可以使用DisplayMetrics 并确定屏幕密度。像这样的:
int dpValue = 5; // margin in dips
float d = context.getResources().getDisplayMetrics().density;
int margin = (int)(dpValue * d); // margin in pixels
我记得最好使用地板进行偏移和四舍五入的宽度。
【讨论】:
Resources.getSystem().getDisplayMetrics().denisty 以防您在没有上下文的 Util 类中。来自here
我遇到了同样的问题并使用此技术解决了它:
首先,我在 res/values 文件夹中添加了一个名为 dimensions.xml 的 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);
最后,我创建了我的布局参数:
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
layoutParams.SetMargins(myMarginPx, myMarginPx, myMarginPx, myMarginPx);
【讨论】:
int getDimenInt(Context context, @DimenRes int dimenRes){ return context.getResources().getDimensionPixelSize(dimenRes); }
您可以将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());
【讨论】:
对于 kotlin 的人来说,我有方便的助手乐趣,非常有效:)
fun setMarginsInDp(v: View, l: Int, t: Int, r: Int, b: Int) {
if (v.layoutParams is ViewGroup.MarginLayoutParams){
val screenDensity: Float = v.context.resources.displayMetrics.density
val params: ViewGroup.MarginLayoutParams = v.layoutParams as ViewGroup.MarginLayoutParams
params.setMargins(l*screenDensity.toInt(), t*screenDensity.toInt(), r*screenDensity.toInt(), b*screenDensity.toInt())
v.requestLayout()
}
}
只需传入一个有效的视图并设置好!
【讨论】: