ハードウェアアクセラレーションの罠
久しぶりにAndroidでカスタムViewを書いている。内容はiOSで作ったUIViewからの移植であり、画像の加工前のプレビューを表示するものだ。技術的には別に難しくは無いのだが、画像をassetからロードするとエミュレータでは発生しなかった例外が出る。
サンプルコード
//アセットに配置したイメージをロードする try { InputStream is = context.getResources().getAssets().open("sample.png"); this.setImageBitmap(BitmapFactory.decodeStream(is)); } catch (IOException e) { e.printStackTrace(); }
発生した例外
11-26 13:51:28.825: W/OpenGLRenderer(9048): Bitmap too large to be uploaded into a texture (1661x2252, max=2048x2048)
2048x2048ピクセル以上の画像をロードすることはできないらしい。OpenGLRendererを使っているということはOpenGLの制限か。
ということはGPUアクセラレーションが有効になっていることかと開発者向け設定画面を見ると
Hardware Acceleration | Android Developers
なるほどICSからは基本有効で、更に色々なレイヤでアクセラレーションの有効無効を設定できるのね。
とりあえずViewレベルでアクラレーションを無効にする場合は
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
で良いようだ。(ただし、API Level11から使用可能)