我正在做:
button.setLayoutParams(new GridView.LayoutParams(65, 65));
根据文档,宽度和高度的单位(上面都是65)是"像素".你如何强制这是设备无关的像素,或"dp"?
Rob*_*ond 529
您必须使用显示比例因子将其从dps转换为像素.
final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);
Run Code Online (Sandbox Code Playgroud)
drs*_*boo 215
我知道这是一个老问题但是我发现了一种更简洁的方式来进行这种转换.
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)
vin*_*'th 35
根据您的要求,还有其他解决方案.您似乎在编译时知道dp中的维度,因此您可以在资源中添加维度条目.然后你可以查询dimen条目,它将自动转换为此调用中的像素:
final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);
Run Code Online (Sandbox Code Playgroud)
而您的dimens.xml将具有:
<dimen name="dimen_entry_in_dp">72dp</dimen>
Run Code Online (Sandbox Code Playgroud)
扩展这个想法,你可以简单地存储1dp或1sp的值作为维度条目并查询该值并将其用作乘数.使用此方法,您将使代码与数学内容隔离,并依赖库来执行计算.
Dav*_*vid 34
测试的最简单方法(甚至可以从api 1开始):
getResources().getDimensionPixelSize(R.dimen.example_dimen);
Run Code Online (Sandbox Code Playgroud)
来自文件:
检索特定资源ID的维度,以用作原始像素的大小.这与getDimension(int)相同,只是将返回的值转换为整数像素以用作大小.大小转换涉及舍入基值,并确保非零基值的大小至少为一个像素.
是的,它会使值四舍五入,但它并不是很糟糕(只是在hdpi和ldpi设备上的奇数值需要在ldpi不常见时添加一点值)我在xxhdpi设备中测试,将4dp转换为16(像素),这是真正.
基于 drspaceboo 的解决方案,借助 Kotlin,您可以使用扩展程序Float
更轻松地转换为 Dips。
fun Float.toDips() =
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, resources.displayMetrics);
Run Code Online (Sandbox Code Playgroud)
用法:
(65f).toDips()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
177327 次 |
最近记录: |