在 Android 中将 dp 转换为 px 时出现的错误

Errors that occur when converting dp to px in Android

我正在使用此代码将 dp 更改为 px。

public static int DpToPixel(Context context, int DP) {
    float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DP, context.getResources().getDisplayMetrics());
    return (int) px;
}

问题

以编程方式创建 TextView 时,设置宽度和高度(以像素为单位),如下行所示。

val width = DpToPixel(requireContext(), 96)
val height = DpToPixel(requireContext(), 14)

val textView = TextView(requireContext()).apply {
    layoutParams = ConstraintLayout.LayoutParams(width, height)
}

因此,我认为 textView 的宽度为 96dp,高度为 14dp

然而,当我实际检查时,textView 的高度设置为 13dp

问题

  1. dp转px时出现错误如何解决?

  2. 是否有使用 DP 单位的宽度和高度创建 TextView

感谢您阅读我的问题。

将视图添加到父视图组后更新布局参数:

val txt = TextView(requireContext())
parentView.addView(txt)
txt.updateLayoutParams<ConstraintLayout.LayoutParams> { // Update width and height
    width = YOUR_DP_WIDTH
    height = YOUR_DP_HEIGHT
}

通过viewTreeObserver检查测量的宽度和高度:

txt.viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
        txt.viewTreeObserver.removeOnGlobalLayoutListener(this)
        Log.e("MEASURE", "W: ${txt.measuredWidth}, H: ${txt.measuredHeight}") // Here you can check measured width and height
        Log.e("MEASURE", "ConvertedW: ${YOUR_DP_WIDTH}, ConvertedH: ${YOUR_DP_HEIGHT}") // And compare sizes with converted values 
    }
})

最好从维度资源中提取所需的值:

val txtWidth = resources.getDimensionPixelOffset(R.dimen.txt_width) // Int
val txtWidth = resources.getDimensionPixelSize(R.dimen.txt_width) // Rounded Int
val txtWidth = resources.getDimension(R.dimen.txt_width) // Float