我在做:
button.setLayoutParams(new GridView.LayoutParams(65, 65));
根据文档,宽度和高度的单位(上面均为65)是“像素”。你如何强制这是设备无关的像素,或“dp”?
答案 0 :(得分:507)
您必须使用显示比例因子将其从dps转换为像素。
final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);
答案 1 :(得分:201)
我知道这是一个古老的问题,但是我发现了一种更简洁的方法来进行这种转换。
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
答案 2 :(得分:34)
根据您的要求,还有替代解决方案。您似乎在编译时知道dp中的维度,因此您可以在资源中添加维度条目。然后你可以查询dimen条目,它将自动转换为此调用中的像素:
final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);
你的dimens.xml将有:
<dimen name="dimen_entry_in_dp">72dp</dimen>
扩展这个想法,你可以简单地存储1dp或1sp的值作为维度条目并查询该值并将其用作乘数。使用这种方法,您将使代码与数学内容隔离,并依赖库来执行计算。
答案 3 :(得分:29)
getResources().getDimensionPixelSize(R.dimen.example_dimen);
来自文件:
检索特定资源ID的维度以用作大小 在原始像素。这与getDimension(int)相同,除了 返回值将转换为整数像素以用作大小。一个 大小转换涉及舍入基值,并确保a 非零基值至少是一个像素。
是的,它会使值四舍五入,但它不是很糟糕(只是在hdpi和ldpi设备上的奇数值,当ldpi不常见时需要添加一点值) 我在一个将4dp转换为16(像素)的xxhdpi设备中进行了测试,这是真的。
答案 4 :(得分:2)
基于drspaceboo的解决方案,借助Kotlin,您可以使用扩展程序将Float
转换为倾角更容易。
fun Float.toDips() =
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, resources.displayMetrics);
用法:
(65f).toDips()