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

我在做:

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

根据文档,宽度和高度的单位(上面都是65)是“像素”。您如何强制这是设备独立的像素,或“dp”?

217618 次浏览

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

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

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

Java

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

芬兰湾的科特林

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

根据您的要求,也有替代解决方案。似乎您在编译时就知道dp中的维度,因此可以在资源中添加一个dimen条目。然后你可以查询dimen条目,它将在这个调用中自动转换为像素:

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

你的dimensions。xml会有:

<dimen name="dimen_entry_in_dp">72dp</dimen>

扩展此思想,您可以简单地将1dp或1sp的值存储为dimen项,并查询该值并将其用作乘数。使用这种方法,您可以将代码与数学内容隔离开来,并依赖于库来执行计算。

经过测试的最简单的方法(甚至适用于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