我正在加载一个位图,用作我的OpenGLES 2.0应用程序中的纹理
如果我通过 Bitmapfactory 加载并使用位图,那么一切正常。像这样:
加载
public void loadBitmaps{
backgrounds= BitmapFactory.decodeResource(view.getResources(), R.drawable.backgrounds, BMFOptions);
...
使用
//Apply as texture to OpenGL Quad
回收
backgrounds.recycle();
现在,问题是...........
当我将位图加载为bitmapDrawable时,我遇到了问题(在下面的代码中解释)。像这样:
在班级声明BitmapDrawable
public class Res{
BitmapDrawable bd;
...
加载
public void loadBitmaps(){
bd = (BitmapDrawable) view.getResources().getDrawable(R.drawable.backgrounds);
backgrounds = bd.getBitmap();
...
使用
//Apply as texture to OpenGL Quad
回收
backgrounds.recycle();
当这样做时,它第一次工作,但如果我然后按回退出,然后重新启动应用程序,纹理就不会显示,而我得到的只是黑色四边形。
如果我执行以下任何操作,它可以解决问题,我想知道为什么......
BitmapDrawable bd =(BitmapDrawable) 。view.getResources()getDrawable(R.drawable.backgrounds);
bd = null;
注意我需要以这种方式访问位图,而不是使用BitmapFactory,因为我通过XML Alias访问它。
答案 0 :(得分:3)
Drawable
个实例,因此当您调用getDrawable()
时,它将加载当前缓存的实例,而不是创建新的位图。如果您回收基础位图,那将导致将来使用的问题。您可能想要做的是在修改之前复制drawable:
BitmapDrawable bmpDrawable = (BitmapDrawable) view.getResources()
.getDrawable(R.drawable.backgrounds);
Bitmap original = bmpDrawable.getBitmap();
Bitmap copy = original.copy(original.getConfig(), true);
有关可绘制突变的更多信息,请参阅this blog post。