求助如何做网站推广,微博网站开发,如何制作多网页网站,手机兼职在哪个网站做Android 屏幕显示与 Bitmap 内存详解
前言
在 Android 开发中#xff0c;理解屏幕显示单位和 Bitmap 内存占用是构建高效应用的基础。本文将详细介绍相关概念、计算公式及单位转换#xff0c;并通过实例分析 Bitmap 在内存中的表现。
一、屏幕显示单位基础
1.1 基本单位及…Android 屏幕显示与 Bitmap 内存详解
前言
在 Android 开发中理解屏幕显示单位和 Bitmap 内存占用是构建高效应用的基础。本文将详细介绍相关概念、计算公式及单位转换并通过实例分析 Bitmap 在内存中的表现。
一、屏幕显示单位基础
1.1 基本单位及概念
px 手机屏幕分辨率的基本单位与物理像素一一对应dp 密度无关像素1dp (屏幕密度/160)px用于保证不同屏幕密度下视图尺寸的一致性sp 可缩放像素主要用于字体大小会随系统字体大小设置变化dpi 屏幕密度每英寸包含的像素点数密度越大每英寸内容纳的点数就越多ppi 每英寸像素数由屏幕分辨率和物理尺寸计算得出的近似值
1.2 Android 密度等级
密度等级密度值(dpi)比例对应系数资源目录ldpi1200.75x0.75drawable-ldpimdpi1601x1.0drawable-mdpihdpi2401.5x1.5drawable-hdpixhdpi3202x2.0drawable-xhdpixxhdpi4803x3.0drawable-xhdpixxxhdpi6404x4.0drawable-xxhdpi
二、屏幕单位计算公式与转换
2.1 基本计算公式
px 与 dp 的转换:
px dp × (dpi ÷ 160)
dp px × (160 ÷ dpi)px 与 sp 的转换:
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.densityreturn (dpValue * scale 0.5f).toInt()}/*** px转dp*/fun px2dp(context: Context, pxValue: Float): Int {val scale context.resources.displayMetrics.densityreturn (pxValue / scale 0.5f).toInt()}/*** sp转px*/fun sp2px(context: Context, spValue: Float): Int {val fontScale context.resources.displayMetrics.scaledDensityreturn (spValue * fontScale 0.5f).toInt()}/*** px转sp*/fun px2sp(context: Context, pxValue: Float): Int {val fontScale context.resources.displayMetrics.scaledDensityreturn (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.displayMetricsreturn 屏幕宽度(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.byteCountval kb bytes / 1024.0val mb kb / 1024.0return 内存占用(Bytes): $bytes bytes内存占用(KB): ${String.format(%.2f, kb)} KB内存占用(MB): ${String.format(%.2f, mb)} MB.trimIndent()
}