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

时间:2011-03-10 03:38:51

标签: android scaling

我在做:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

根据文档,宽度和高度的单位(上面均为65)是“像素”。你如何强制这是设备无关的像素,或“dp”?

5 个答案:

答案 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)

经过测试的最简单的方法(甚至可以从api 1开始)是:

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