サイズ4022(幅)x 3779(幅)のチャートの相対レイアウトを動的に作成しました。ただし、グラフは50〜100のテキストビューのみで構成されているため、結果の.pngは小さくなります。これは、チャートをキャプチャするために使用する短いコードです。
// chart_container was built dynamically before calling this function:
public void saveBitmap(RelativeLayout chart_container) {
int scale_ratio = 2;
int chartWidth = chart_container.getWidth();
int chartHeight = chart_container.getHeight();
Log.i(TAG, "orignal width:" + chartWidth + ", original height: " + chartHeight);
Bitmap mBitmap = Bitmap.createBitmap(chartWidth / scale_ratio, chartHeight / scale_ratio, Bitmap.Config.ARGB_8888); // crashes when scale_ratio is 1
Canvas mCanvas = new Canvas(mBitmap);
chart_container.draw(mCanvas);
out = new FileOutputStream("/data/data/package/chart.jpeg");
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
}
LogCat出力:
元の幅:4022、元の高さ:3779
「scale_ratio」が2の場合、チャートの左上の4分の1が正常に保存されます。ファイルサイズはわずか22kです。「scale_ratio」が1の場合、「createBitmap」行のメモリ不足が原因でアプリがクラッシュします。
java.lang.OutOfMemoryError:ビットマップサイズがVMバジェットを超えています
チャート全体を保存する良い方法はありますか?あなたの助けは大歓迎です!!!
更新:エミュレーターVMのヒープサイズを10倍に増やすことで、この問題を解決しました。これで完全なチャートができました。