我在做:
按钮。setLayoutParams(新显示数据表格。LayoutParams (65, 65));
根据文档,宽度和高度的单位(上面都是65)是“像素”。您如何强制这是设备独立的像素,或“dp”?
我在做:
按钮。setLayoutParams(新显示数据表格。LayoutParams (65, 65));
根据文档,宽度和高度的单位(上面都是65)是“像素”。您如何强制这是设备独立的像素,或“dp”?
当前回答
我知道这是一个老问题,但我找到了一个更整洁的方式来做这个转换。
Java
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
科特林
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)
其他回答
根据您的要求,也有替代解决方案。似乎您在编译时就知道dp中的维度,因此可以在资源中添加一个dimen条目。然后你可以查询dimen条目,它将在这个调用中自动转换为像素:
final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);
你的dimensions。xml会有:
<dimen name="dimen_entry_in_dp">72dp</dimen>
扩展此思想,您可以简单地将1dp或1sp的值存储为dimen项,并查询该值并将其用作乘数。使用这种方法,您可以将代码与数学内容隔离开来,并依赖于库来执行计算。
我知道这是一个老问题,但我找到了一个更整洁的方式来做这个转换。
Java
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
科特林
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)
经过测试的最简单的方法(甚至适用于API 1)是:
getResources().getDimensionPixelSize(R.dimen.example_dimen);
从文件:
检索用于作为大小的特定资源ID的维度 原始像素。这与getDimension(int)相同,除了 返回值转换为整数像素,用作大小。一个 大小转换涉及到舍入基本值,并确保a 非零基本值的大小至少为一个像素。
是的,它四舍五入的值,但它不是很坏(只是在奇数值的hdpi和ldpi设备需要添加一点值时,ldpi不是很常见) 我在xxhdpi设备上进行了测试,将4dp转换为16(像素),这是正确的。
您必须使用显示比例因子将其从dps转换为像素。
final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);
基于drspaceboo的解决方案,使用Kotlin,您可以使用扩展来更容易地将Float转换为dip。
fun Float.toDips() =
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, resources.displayMetrics);
用法:
(65f).toDips()