我在做:
按钮。setLayoutParams(新显示数据表格。LayoutParams (65, 65));
根据文档,宽度和高度的单位(上面都是65)是“像素”。您如何强制这是设备独立的像素,或“dp”?
我在做:
按钮。setLayoutParams(新显示数据表格。LayoutParams (65, 65));
根据文档,宽度和高度的单位(上面都是65)是“像素”。您如何强制这是设备独立的像素,或“dp”?
当前回答
根据您的要求,也有替代解决方案。似乎您在编译时就知道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项,并查询该值并将其用作乘数。使用这种方法,您可以将代码与数学内容隔离开来,并依赖于库来执行计算。
其他回答
您必须使用显示比例因子将其从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项,并查询该值并将其用作乘数。使用这种方法,您可以将代码与数学内容隔离开来,并依赖于库来执行计算。
芬兰湾的科特林版本
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
基于drspaceboo的解决方案,使用Kotlin,您可以使用扩展来更容易地将Float转换为dip。
fun Float.toDips() =
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, resources.displayMetrics);
用法:
(65f).toDips()