如何通过Drawable从drawable文件夹批量获取bird系列图片为Bitmap数组?
嘿,这个场景我太熟悉了!手动写9次重复代码不仅麻烦,后期维护也头疼,我们可以通过动态获取资源ID或者预定义资源ID数组的方式来批量加载这些图片,直接把它们存进Bitmap数组里,给你两种实用方案:
方案一:动态生成资源名获取ID(灵活但稍慢)
这种方法适合资源命名有规律的场景(比如你的bird1到bird9),通过字符串拼接生成资源名,再用getIdentifier()动态拿到对应的资源ID,循环加载即可:
// 初始化Bitmap数组,长度对应图片数量 Bitmap[] birdBitmaps = new Bitmap[9]; Resources res = getApplicationContext().getResources(); String packageName = getApplicationContext().getPackageName(); for (int i = 0; i < 9; i++) { // 拼接资源名:bird1、bird2...bird9 String drawableName = "bird" + (i + 1); // 获取资源ID:参数分别是资源名、资源类型、包名 int drawableId = res.getIdentifier(drawableName, "drawable", packageName); if (drawableId != 0) { // 检查资源是否存在,避免空指针 Drawable drawable = ResourcesCompat.getDrawable(res, drawableId, null); birdBitmaps[i] = ((BitmapDrawable) drawable).getBitmap(); } else { // 资源不存在时的容错处理,比如打印日志或设置默认图 Log.e("BitmapLoader", "未找到资源:" + drawableName); birdBitmaps[i] = null; // 或者替换成默认Bitmap } }
注意点:
getIdentifier()是通过反射实现的,性能比直接用R.drawable.ID稍差,如果图片数量很多,更推荐方案二- 资源名必须和drawable文件夹里的文件名完全一致(Android资源名不区分大小写,但最好统一小写)
- 返回值为0表示未找到对应资源,一定要做容错处理,避免崩溃
方案二:预定义资源ID数组(高效推荐)
如果你的图片数量固定,直接把所有R.drawable.birdX的ID放进数组,循环加载即可。这种方法没有反射开销,性能更优:
// 提前把所有bird图片的资源ID存入数组 int[] birdDrawableIds = { R.drawable.bird1, R.drawable.bird2, R.drawable.bird3, R.drawable.bird4, R.drawable.bird5, R.drawable.bird6, R.drawable.bird7, R.drawable.bird8, R.drawable.bird9 }; Bitmap[] birdBitmaps = new Bitmap[birdDrawableIds.length]; Resources res = getApplicationContext().getResources(); for (int i = 0; i < birdDrawableIds.length; i++) { Drawable drawable = ResourcesCompat.getDrawable(res, birdDrawableIds[i], null); birdBitmaps[i] = ((BitmapDrawable) drawable).getBitmap(); }
额外提示:
如果你的图片是VectorDrawable(矢量图),直接强转BitmapDrawable会报错,需要先把矢量图转换成Bitmap,比如用Bitmap.createBitmap()配合Canvas绘制的方式处理,不过看你的代码应该是普通位图,这个可以暂时忽略~
内容的提问来源于stack exchange,提问作者techno
相关产品推荐
相关产品推荐

