这种加载方式可以在保证质量的同时节约加载图片时所需内存,特别适用于加载帧动画,返回bitmap也便于及时清理,防止OOM以下为代码:
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.LevelListDrawable;
import android.net.Uri;
import android.text.TextUtils;import com.incall.apps.lib.util.LogUtil;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;public class BitmapLoadUtil {private static final String TAG = "BitmapLoadUtil";public static Bitmap loadBitmap(String path) {Bitmap bitmap;if (TextUtils.isEmpty(path)) {return null;}try {bitmap = BitmapFactory.decodeFile(path);} catch (Exception e) {LogUtil.d1(TAG, "根据path加载图片时出错:" + e.getMessage());return null;}return bitmap;}public static Bitmap loadBitmap(Context context, Uri uri) {Bitmap bitmap;InputStream stream = null;try {stream = context.getContentResolver().openInputStream(uri);bitmap = BitmapFactory.decodeStream(stream);}catch (Exception e) {LogUtil.d1(TAG, "根据uri加载图片时出错:" + e.getMessage());return null;} finally {try {if (stream != null) {stream.close();}} catch (IOException e) {e.printStackTrace();}}return bitmap;}/*** 根据资源ID加载图片,最好放在子线程* @param resId 图片资源id* @return 加载完成的bitmap*/public static Bitmap loadBitmap(Context context, int resId) {Bitmap bitmap;InputStream stream = null;try {//获取资源图片BitmapFactory.Options opt = new BitmapFactory.Options();opt.inPreferredConfig = Bitmap.Config.ARGB_8888;opt.inPurgeable = true;opt.inInputShareable = true;stream = context.getResources().openRawResource(resId);bitmap = BitmapFactory.decodeStream(stream, null, opt);} catch (Exception e) {LogUtil.d1(TAG, "根据resId加载图片时出错:" + e.getMessage());return null;} finally {try {if (stream != null) {stream.close();}} catch (IOException e) {e.printStackTrace();}}return bitmap;}/*** 根据图片ArrayId加载Bitmap列表,此方法必须放在子线程* @param arrayId 图片ArrayId* @return Bitmap列表*/public static List<Bitmap> loadBitmapList(Context context, int arrayId) {List<Bitmap> bitmaps = new ArrayList<>();int[] ids = getRes(context, arrayId);for (int id : ids) {Bitmap bmp = loadBitmap(context, id);if (bmp == null) {LogUtil.d1(TAG, "加载图片列表时出错");for (Bitmap bitmap : bitmaps) {bitmap.recycle();}return null;}bitmaps.add(bmp);}return bitmaps;}/*** 根据Array的id获取其中的id数组** @param id Array的id* @return 其中的id数组*/private static int[] getRes(Context context, int id) {TypedArray typedArray = context.getResources().obtainTypedArray(id);int len = typedArray.length();int[] resId = new int[len];for (int i = 0; i < len; i++) {resId[i] = typedArray.getResourceId(i, -1);}typedArray.recycle();return resId;}/*** 根据bitmap列表加载帧动画资源** @param bitmaps 已加载的图片列表* @return 可用资源*/public static LevelListDrawable getFrameDrawable(Context context, List<Bitmap> bitmaps) {LevelListDrawable listDrawable = new LevelListDrawable();if (bitmaps == null || bitmaps.size() == 0) {return null;}for (int i = 0; i < bitmaps.size(); i++) {BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), bitmaps.get(i));listDrawable.addLevel(i, i + 1, bitmapDrawable);//添加到LevelListDrawable}return listDrawable;}
}