对于一张图片,你知道应该存放在那个资源目录下面吗,或者说,放在那个资源目录下加载起来更省内存呢?在日常开发中我们可能不太注意这些东西,但是这些却是基础,是必不可少的一环,所以这几天重新温习了一下并整理了一下。
MDPI | HDPI | XHDPI | XXHDPI | XXXHDPI | |
---|---|---|---|---|---|
density(像素密度) | 160 | 240 | 320 | 480 | 640 |
分辨率 | 360x640 | 540x960 | 720x1280 | 1080x1920 | 1440x2560 |
比例 | 1 | 1.5 | 2 | 3 | 4 |
在 android 中,标准的 dpi = 160,也就是 1 英寸中有 160 个像素。上面表格中的比例就是通过 160 来算出来的。每种密度的比例都是和 150 来进行比较的。
设备独立像素值,也就是我们定义在布局文件中的值,但是最终会根据系统计算转为 px。
假设每英寸的像素是 240像素,也就是 dpi = 240。也就是 dp = 1.5 px。
在 android 中,如果每英寸的像素为 160,此时 1dp = 1px。160 也是 android 中的一个参考值。公式参考 dp 中的。
getByteCount()
public final int getByteCount() {
if (mRecycled) {
Log.w(TAG, "Called getByteCount() on a recycle()'d bitmap! "
+ "This is undefined behavior!");
return 0;
}
// int result permits bitmaps up to 46,340 x 46,340
return getRowBytes() * getHeight();
}
图片占用内存大小的理论需求值
getAllocationByteCount()
public final int getAllocationByteCount() {
if (mRecycled) {
Log.w(TAG, "Called getAllocationByteCount() on a recycle()'d bitmap! "
+ "This is undefined behavior!");
return 0;
}
return nativeGetAllocationByteCount(mNativePtr);
}
图片实际占用内存的大小
例:图片宽 112 像素,高 131 像素,大小 20 kb 左右。
Assets 中的资源文件
BitmapFactory.decodeStream(context.getAssets().open("android.png"));
例1: 格式为 png 。在 assets 的目录下通过 Bitmap 加载。
其中加载格式为 ARGB_8888。出来后大小大概是 58 kb 左右。
计算的方式就是 112 * 131 * 4 = 58688 。也就是 长乘宽在乘4,至于为什么要乘以四,因为格式是 ARGB_8888,每个像素点有四个字节,后面四个8表示8个比特,8个比特就是一个字节。一共四个字节。
例2:上面图片,格式为 jpg。
需要注意的是 jpg 的图片没有 Alpha 通道,也就是说图片不会透明。所以采用 ARGB_8888 加载后前面的 A 是没有啥用的。
所以需要采用 RGB_565 的格式来加载图片。计算的方式就是 112 * 131 * 2 = 29344 ,565 刚好是两个字节。代码如下:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
BitmapFactory.decodeStream(context.getAssets().open("android.png"),options);
如果将 png 的图片使用 RGB_565 格式进行加载,加载出的结果上面也会一样,因为少了 Alpah。
drawable 系列目录中的图片文件,需要注意 dpi 类型的影响
resources.displayMetrics.density
来获取。
所以,drawable 中的图片大小计算方式就是: 图片 / 所在drawable对应dpi的比例 * 屏幕的dpi。
raw 中的资源,该文件中的资源不会受到任何处理。
以上内容都是通过查找别人的资料和自己的一些实践而得出来的,如果有错误的地方还请大家指点一下,谢谢!!