这种加载方式可以在保证质量的同时节约加载图片时所需内存,特别适用于加载帧动画,返回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; } }