当前位置: 首页 > news >正文

Bitmap -> Bitmap安卓设备上的显示和内存

Android 屏幕显示与 Bitmap 内存详解

前言

Android 开发中,理解屏幕显示单位和 Bitmap 内存占用是构建高效应用的基础。本文将详细介绍相关概念、计算公式及单位转换,并通过实例分析 Bitmap 在内存中的表现。

一、屏幕显示单位基础

1.1 基本单位及概念

  • px 手机屏幕分辨率的基本单位,与物理像素一一对应
  • dp 密度无关像素,1dp = (屏幕密度/160)px,用于保证不同屏幕密度下视图尺寸的一致性
  • sp 可缩放像素,主要用于字体大小,会随系统字体大小设置变化
  • dpi 屏幕密度,每英寸包含的像素点数,密度越大,每英寸内容纳的点数就越多
  • ppi 每英寸像素数,由屏幕分辨率和物理尺寸计算得出的近似值

1.2 Android 密度等级

密度等级密度值(dpi)比例对应系数资源目录
ldpi1200.75x0.75drawable-ldpi
mdpi1601x1.0drawable-mdpi
hdpi2401.5x1.5drawable-hdpi
xhdpi3202x2.0drawable-xhdpi
xxhdpi4803x3.0drawable-xhdpi
xxxhdpi6404x4.0drawable-xxhdpi

二、屏幕单位计算公式与转换

2.1 基本计算公式

  • pxdp 的转换:
px = dp × (dpi ÷ 160)
dp = px × (160 ÷ dpi)
  • pxsp 的转换:
px = sp × (dpi ÷ 160) × fontScale
sp = px ÷ ((dpi ÷ 160) × fontScale)
  • ImageView 实际像素计算:
    实际像素宽/高 = XML中设置的dp值 × (inTargetDensity ÷ 160)
  • Bitmap 尺寸计算:
    加载后的Bitmap宽/高 = 原始宽/高 × (inTargetDensity ÷ inDensity)

2.2 单位转换工具

object DisplayUtils {
    /**
     * dp转px
     */
    fun dp2px(context: Context, dpValue: Float): Int {
        val scale = context.resources.displayMetrics.density
        return (dpValue * scale + 0.5f).toInt()
    }

    /**
     * px转dp
     */
    fun px2dp(context: Context, pxValue: Float): Int {
        val scale = context.resources.displayMetrics.density
        return (pxValue / scale + 0.5f).toInt()
    }

    /**
     * sp转px
     */
    fun sp2px(context: Context, spValue: Float): Int {
        val fontScale = context.resources.displayMetrics.scaledDensity
        return (spValue * fontScale + 0.5f).toInt()
    }

    /**
     * px转sp
     */
    fun px2sp(context: Context, pxValue: Float): Int {
        val fontScale = context.resources.displayMetrics.scaledDensity
        return (pxValue / fontScale + 0.5f).toInt()
    }

    /**
     * 获取屏幕宽度(px)
     */
    fun getScreenWidth(context: Context): Int {
        return context.resources.displayMetrics.widthPixels
    }

    /**
     * 获取屏幕高度(px)
     */
    fun getScreenHeight(context: Context): Int {
        return context.resources.displayMetrics.heightPixels
    }

    /**
     * 获取状态栏高度
     */
    fun getStatusBarHeight(context: Context): Int {
        val resourceId = context.resources.getIdentifier(
            "status_bar_height", "dimen", "android"
        )
        return if (resourceId > 0) {
            context.resources.getDimensionPixelSize(resourceId)
        } else {
            0
        }
    }
}

2.3 获取设备显示信息

fun getDisplayMetricsInfo(context: Context): String {
    val dm = context.resources.displayMetrics
    return """
        屏幕宽度(px): ${dm.widthPixels}
        屏幕高度(px): ${dm.heightPixels}
        屏幕密度(density): ${dm.density}
        屏幕密度DPI: ${dm.densityDpi}
        X轴DPI: ${dm.xdpi}
        Y轴DPI: ${dm.ydpi}
        字体缩放因子: ${dm.scaledDensity}
        屏幕宽度(dp): ${dm.widthPixels / dm.density}
        屏幕高度(dp): ${dm.heightPixels / dm.density}
    """.trimIndent()
}

三、Bitmap 内存计算与管理

3.1 Bitmap 内存计算公式

Bitmap 在内存中的占用大小计算公式:

内存大小(字节) = 宽度(像素) × 高度(像素) × 每像素字节数

每像素字节数由 Bitmap.Config 决定:

配置类型每像素字节数说明
ALPHA_81仅存储透明度
RGB_5652无透明度通道
ARGB_88884默认配置,最高质量
RGBA_F168高精度浮点配置

3.2 Bitmap 内存大小:未压缩的原始像素数据大小

  • 以一张 1920×1080 分辨率的图片为例:
    • 内存占用 (ARGB_8888)1920 × 1080 × 4 = 8,294,400 字节 ≈ 7.91 MB

3.3 不同单位的内存大小表示

fun calculateBitmapMemorySize(bitmap: Bitmap): String {
    val bytes = bitmap.byteCount
    val kb = bytes / 1024.0
    val mb = kb / 1024.0
    
    return """
        内存占用(Bytes): $bytes bytes
        内存占用(KB): ${String.format("%.2f", kb)} KB
        内存占用(MB): ${String.format("%.2f", mb)} MB
    """.trimIndent()
}

相关文章:

  • 汽车轮胎损伤缺陷分割数据集labelme格式1957张3类别
  • iOS安全和逆向系列教程 第1篇: iOS逆向工程概述与学习路线图
  • 第七章:项目实战 - 第四节 - Tailwind CSS 移动端适配实践
  • 计算机毕业设计SpringBoot+Vue.js装饰工程管理系统(源码+文档+PPT+讲解)
  • 算数操作符、赋值操作符、单目操作符、强制类型转换
  • 五、Redis 持久化:RDB 与 AOF 深入解析与优化策略
  • linux一些使用技巧
  • Rust 入门+语法详解+Windows 下 Cursor AI辅助开发
  • Linux中死锁问题的探讨
  • 【C语言】结构体自动对齐问题 解析与解决方案
  • Halcon 车牌识别-超精细教程
  • 第四章 STM32 Flash
  • Vue2 + Quill富文本编辑器
  • Netty笔记9:粘包半包
  • golang程序员如何3天完成python学习
  • 清理pip和conda缓存
  • Elasticsearch 限制索引大小与索引模板匹配冲突解决方案
  • 开源架构与人工智能的融合:开启技术新纪元
  • 单元测试与仿真程序之间的选择
  • 【计算机网络入门】初学计算机网络(十一)重要
  • 网站效果检测/企业建设网站公司
  • 网站开发实训教程/没干过网络推广能干吗
  • 专注苏州网站优化/阿里指数官网
  • 有一个箭头的做网站的软件/免费b2b网站有哪些
  • 山东住房和建设厅网站首页/代写软文
  • 网站建设新手如何自己做网站/如何优化网站推广