以下の部分でUnsupportedOperationExceptionが発生しクラッシュする。
canvas.drawPicture(picture);
drawPicture()はハードウェアアクセラレーションに対応していないらしいので以下のように修正した。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && canvas.isHardwareAccelerated()) { picture.draw(canvas); } else { canvas.drawPicture(picture); }
追記
ImageViewなどのViewの描画でdrawableのdrawの中で以下の処理がされるとkindleでは描画できない。
picture.draw(canvas);
以下のようにハードウェアアクセラレーションが有効になっているViewでソフトウェアレンダリングするように指定した。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {// for kindle imageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
以下のようにPictureDrawableをBitmapに変換してViewにセットしても上手く表示できる。
canvas.drawBitmap(pictureDrawable2Bitmap(picture), new Matrix(), new Paint());
private static Bitmap pictureDrawable2Bitmap(Picture picture){ PictureDrawable pictureDrawable = new PictureDrawable(picture); Bitmap bitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(),pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.drawPicture(pictureDrawable.getPicture()); return bitmap; }
今回はdrawが頻繁にコールされるのでこの手法は取らなかった。