[Tip] View 으로로부터 Bitmap 가져오기 :: getDrawingCache 를 호출했을 때 발생하는 문제 해결.
// SDK 22 기준.
view.setDrawingCacheEnabled(true);// 임의로 measure 와 layout 을 호출한다.
//view.measure(View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY),
// View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.EXACTLY));
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
// 알파값을 갖는다면 어떤 옵션을 줘도 ARGB_8888 (32비트) 비트맵으로 반환되며,
// 알파값을 갖지 않는다면 어떤 옵션을 줘도 RGB_565 (16비트) 의 비트맵으로 반환한다 (;;;)
// 게다가 호출하는 즉시 캐쉬 비트맵이 recycle 된다.
//view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_AUTO);
Bitmap cache = view.getDrawingCache(true);
if(cache != null) {
Bitmap cachedBitmap = Bitmap.createBitmap(cache);
}view.setDrawingCacheEnabled(false);
보통은 위와 같은 방법으로 호출하면 View 의 bitmap 캐쉬를 무사히 가져올 수 있다.
하지만 이 방법을 사용했을 때, setDrawingCacheQuality 옵션을 LOW 로 줘도 ARGB_8888또는 RGB_565 이 반환된다.
View 의 getDrawingCache 내부에 퀄리티 관련 옵션값을 처리하는 부분에 다음과 같은 주석이 있다.
// Never pick ARGB_4444 because it looks awful
그래도 ARGB_4444 를 사용하고 싶다면 다음과 같이 처리하면 된다.
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(bitmap);
canvas.translate(view.getScrollX(), view.getScaleY());
canvas.drawARGB(0, 0, 0, 0);
view.draw(canvas);