在 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()
}

核心优势

  1. 调用简洁:直接通过 dp 值.dp2px(context) 调用,例如 20.dp2px(this)(Activity 中)。
  2. 系统兼容:内部使用 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

注意事项

  1. 上下文不能为空context 参数必须是有效的 Context(如 Activity、Application 等),否则会抛出空指针异常。
  2. 仅适用于 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()
    }
    
  3. 避免频繁调用:在循环或频繁刷新的场景(如 onDraw)中,建议缓存转换结果,减少性能消耗。

通过这种扩展函数的方式,既能保持代码简洁,又能确保 dp 到 px 转换的准确性,是 Kotlin 开发中的推荐写法。

转自:Kotlin 中 Int 扩展函数 - 豆包

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐