Android和以dp为单位编程设置宽度和高度

我正在做:

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()); 

看你的要求,也有替代解决scheme。 看起来你知道编译时在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的值存储为维数条目并查询该值并将其用作乘数。 使用这种方法,你将从math的东西绝对代码,并依靠库来执行计算。

最简单的方法(甚至从api 1工作),testing是:

 getResources().getDimensionPixelSize(R.dimen.example_dimen); 

从文件:

检索特定资源ID的尺寸以用作原始像素的尺寸。 这与getDimension(int)相同,除了返回值被转换为整数像素以用作大小。 大小转换包括四舍五入基值,并确保一个非零基值至less有一个像素的大小。

是的,它四舍五入的价值,但它不是很糟糕(只是在奇数值的HDL和ldpi设备需要添加一点值,当ldpi不是很常见)我testing了一个xdhdpi设备转换4dp到16(像素),这是真正。