参考: https://www.cnblogs.com/dasusu/p/9789389.html http://www.cocoachina.com/articles/30884
计算公式:
1、如果设置了inSampleSize=1,2,4,8 , 则相应的 Sample高度 = 原图高度 * 1,1/2, 1/4, 1/8; Sample宽度 = 原图宽度 * 1,1/2, 1/4, 1/8;
2、(BitmapFactory 中 decodeResource() 方法内部会根据 dpi 进行分辨率的转换,其他 decodeXXX() 就没有了,所以,如果不是decodeResource() 或 图片的来源,如磁盘(assets, raw),文件,流等, 则跳过这步) 新图的高度 = Sample高度 * (设备的 dpi / 目录对应的 dpi ) 新图的宽度 = Sample宽度 * (设备的 dpi / 目录对应的 dpi )
3、 bitmap内存 = 新图的高度 * 新图的宽度 * 每像素大小
参数看下面: 每像素大小根据options中的: Bitmap.Config.ARGB_8888 : 8bit + 8bit + 8bit + 8bit = 32bit = 4Byte Bitmap.Config.ARGB_4444 : 4bit + 4bit + 4bit + 4bit = 16bit = 2Byte Bitmap.Config.RGB_565 : 5bit + 6bit + 5bit = 16bit = 2Byte
原图宽高:
6个目录对应dip: L DPI ( Low Density Screen,120 DPI ),0.75 M DPI ( Medium Density Screen, 160 DPI ),1 H DPI ( High Density Screen, 240 DPI ),1.5 XH DPI ( Extra-high density screen, 320 DPI ),2 XXH DPI( xx-high density screen, 480 DPI ),3 XXXH DPI( xxx-high density screen, 640 DPI ),4
@Override
public void draw(@NonNull Canvas canvas) {
try {
if (mResources != null && mParentViewHeight != 0 && mParentViewWidth != 0) {
if (mLastBitmap == null) {
mLastBitmap = Bitmap.createBitmap(mParentViewWidth, mParentViewHeight, Bitmap.Config.ARGB_4444);
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(mResources, RES_IDS[curFrame], options);
options.inScaled = true;
options.inDensity = mInDensity;
options.inTargetDensity = mInTargetDensity;
options.inJustDecodeBounds = false;
options.inMutable = true;
options.inSampleSize = 4;
options.inBitmap = mLastBitmap; //bitmap内存复用
Bitmap bitmap = BitmapFactory.decodeResource(mResources, RES_IDS[curFrame], options);
int canvasWidth = canvas.getWidth();
int bitMapHeight = bitmap.getHeight();
int bitMapWidth = bitmap.getWidth();
canvas.drawBitmap(bitmap, bitMapWidth,bitMapHeight, mPaint);
Log.e("chen", "density : " + mResources.getDisplayMetrics().density);
Log.e("chen", "byteCount : " + bitmap.getByteCount() + " AllocationByteCount : " + bitmap.getAllocationByteCount());
}
bitmap.getByteCount() :bitmap使用内存的理论值。 bitmap.getAllocationByteCount() :使用options.inBitmap时,bitmap实际使用的内存。
内存优化: 1、设置inSampleSize 2、不影响用户体验的情况下:Bitmap.Config.ARGB_4444
举例: 1、
2、