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