我在做:

按钮。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)

其他回答

您必须使用显示比例因子将其从dps转换为像素。

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

经过测试的最简单的方法(甚至适用于API 1)是:

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

从文件:

检索用于作为大小的特定资源ID的维度 原始像素。这与getDimension(int)相同,除了 返回值转换为整数像素,用作大小。一个 大小转换涉及到舍入基本值,并确保a 非零基本值的大小至少为一个像素。

是的,它四舍五入的值,但它不是很坏(只是在奇数值的hdpi和ldpi设备需要添加一点值时,ldpi不是很常见) 我在xxhdpi设备上进行了测试,将4dp转换为16(像素),这是正确的。

基于drspaceboo的解决方案,使用Kotlin,您可以使用扩展来更容易地将Float转换为dip。

fun Float.toDips() =
        TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, resources.displayMetrics);

用法:

(65f).toDips()

芬兰湾的科特林版本

val scale: Float = resources.displayMetrics.density
val resizedInDp = (stream.videoWidth * scale + 0.5f).toInt()

用法:-

val params: ViewGroup.LayoutParams = yourLayout!!.layoutParams
            val scale: Float = resources.displayMetrics.density
            params.width = (widthDp * scale + 0.5f).toInt() // dp to px
            params.height =
                (heightDp * scale + 0.5f).toInt() // setting height according to aspect ratio
            yourLayout!!.layoutParams = params

我知道这是一个老问题,但我找到了一个更整洁的方式来做这个转换。

Java

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

科特林

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)