Int类型添加dp2px功能方法
·
在 Kotlin 中,可以通过扩展函数为 Int 类型添加 dp2px 方法,实现更简洁的调用(如 16.dp2px(context))。这种方式比工具类调用更符合 Kotlin 的语法风格。
实现代码
kotlin
import android.content.Context
import android.util.TypedValue
/**
* Int 类型的扩展函数:将 dp 转换为 px
* @receiver Int 需要转换的 dp 值(如 16 表示 16dp)
* @param context 上下文(用于获取屏幕密度)
* @return 转换后的 px 值(Int 类型)
*/
fun Int.dp2px(context: Context): Int {
// 使用 TypedValue 进行单位转换(系统提供的工具类,更可靠)
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, // 源单位:dp
this.toFloat(), // 源值:当前 Int 类型的 dp 值
context.resources.displayMetrics // 设备屏幕密度信息
).toInt()
}
核心优势
- 调用简洁:直接通过
dp 值.dp2px(context)调用,例如20.dp2px(this)(Activity 中)。 - 系统兼容:内部使用
TypedValue.applyDimension方法(Android 系统提供),处理了各种屏幕密度的兼容逻辑,比手动计算更可靠。
使用示例
在 Activity 中动态设置控件尺寸:
// 例如:设置一个 100dp x 50dp 的 View
val view = View(this)
val layoutParams = ViewGroup.LayoutParams(
100.dp2px(this), // 宽度:100dp 转换为 px
50.dp2px(this) // 高度:50dp 转换为 px
)
view.layoutParams = layoutParams
注意事项
- 上下文不能为空:
context参数必须是有效的Context(如 Activity、Application 等),否则会抛出空指针异常。 - 仅适用于 Int 类型:如果需要处理
Float类型的 dp 值(如 16.5dp),可以再定义一个Float的扩展函数:kotlin
fun Float.dp2px(context: Context): Int { return TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, this, context.resources.displayMetrics ).toInt() } - 避免频繁调用:在循环或频繁刷新的场景(如
onDraw)中,建议缓存转换结果,减少性能消耗。
通过这种扩展函数的方式,既能保持代码简洁,又能确保 dp 到 px 转换的准确性,是 Kotlin 开发中的推荐写法。
更多推荐



所有评论(0)