[英]Android and setting width and height programmatically in dp units
我正在做:
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());
科特林
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)
测试的最简单方法(甚至从 api 1 开始)是:
getResources().getDimensionPixelSize(R.dimen.example_dimen);
从文档:
检索特定资源 ID 的维度以用作原始像素的大小。 这与 getDimension(int) 相同,只是将返回的值转换为整数像素以用作大小。 大小转换涉及对基值进行四舍五入,并确保非零基值的大小至少为一个像素。
是的,它舍入了这个值,但它不是很糟糕(当 ldpi 不是很常见时,hdpi 和 ldpi 设备上的奇数值需要添加一点值)我在一个将 4dp 转换为 16(像素)的 xxhdpi 设备中进行了测试,那就是真的。
查看您的要求,还有其他解决方案。 似乎您在编译时就知道 dp 中的尺寸,因此您可以在资源中添加一个 dimen 条目。 然后您可以查询 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 的值存储为维度条目并查询该值并将其用作乘数。 使用这种方法,您可以将代码与数学内容隔离开来,并依靠库来执行计算。
基于 drspaceboo 的解决方案,使用 Kotlin,您可以使用扩展更轻松地将Float
转换为 dips。
fun Float.toDips() =
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, resources.displayMetrics);
用法:
(65f).toDips()
Kotlin 版本
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.