从资源中创建 Bitmap out of Drawable 哪种方法更有效?
Bitmap myBitmap = BitmapFactory.decodeResource(context.getResources(),
R.drawable.icon_resource);
VS
Drawable myDrawable = getResources().getDrawable(R.drawable.icon_resource);
Bitmap myBitmap = ((BitmapDrawable) myDrawable).getBitmap();
由于不推荐使用 API 22 以上方法,因此请使用以下方法
Drawable myDrawable = ContextCompat.getDrawable(context, R.drawable.icon_resource)
您可以在 http://source.android.com 上查看位图工厂的源代码 特别是 decodeResource 的代码。
我认为使用 BitmapFactory 是首选,但在任何一种情况下,如果您正在解码多个位图,那么您应该调用一次 getResources() 并存储结果以用作函数的资源参数。
Bitmap myBitmap = BitmapFactory.decodeResource(context.getResources(),
R.drawable.icon_resource);
根据文档,当我们从 inputStream 构造位图时,上面的方法是最好的
VS
Drawable myDrawable = ContextCompat.getDrawable(context, R.drawable.icon_resource)
Bitmap myBitmap = ((BitmapDrawable) myDrawable).getBitmap();
这个解决方案被广泛使用并且性能更好,因为它简单地返回这个可绘制对象使用的位图来渲染。
两者应该具有相似的解码性能。事实上,Drawable 的初始创建将调用
Drawable.createFromResourceStream()
调用 BitmapFactory.decodeResourceStream()
.
但是,
Resources.getDrawable()
和 Context.getDrawable()
使用 Drawable cache,所以如果您使用此 API 多次加载同一个位图,如果 Drawable 在缓存中,它可以跳过解码,性能会更好。
这两种方法都非常有效,但在低端设备上运行速度可能会慢得多。
您只需为每个 ResId 调用 decodeResource() 一次(甚至可能在单独的线程上),然后将加载的资源存储在内存中以供后续调用,以防止臭名昭著的 ANR(应用程序无响应)。