마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 웹뷰 캡쳐 원리 질문

0 추천
안녕하세요~ 안드로이드 개발자입니다.

현재 WebView 캡쳐에 관한 부분을 진행하고 있는데 기본적인 원리가 어떻게 돌아가는지 이해가 안되서 질문을 드립니다....

제가 이해하기로는(인터넷에 찾아본 결과) 웹뷰를 비트맵으로 저장해서 File로 떨어뜨리는 형식인 것 같은데... Bitmap만 만들고 파일로 변환하면 검은 화면이 나오더라구요 (아래는 소스입니다.)

 

Bitmap captureView = Bitmap.createBitmap(webview.getMeasuredWidth(), webview.getHeight(), Bitmap.Config.ARGB_8888);
~~~File 저장 Source~~~

말했듯, 이렇게만 하고 떨어뜨리면 검은 화면이 나오는 반면

 

Bitmap captureView = Bitmap.createBitmap(webview.getMeasuredWidth(), webview.getHeight(), Bitmap.Config.ARGB_8888);

        Canvas screenShotCanvas = new Canvas(captureView);
        arrWebView.get(0).draw(screenShotCanvas);

추가적으로 canvas와 draw를 넣어주면 정상적으로 나오더라구요...

 

이 부분이 잘 이해가 안되서 질문 드립니다...

기본적인 원리 혹은 동작 방식좀 알려주시면 감사하겠습니다 ㅠ-ㅜ
익명사용자 님이 2016년 7월 11일 질문

1개의 답변

+1 추천

1. 캡쳐한 화면을 담을 비트맵 생성

2. 캔버스 생성 (1번의 비트맵을을 이용하도록)

3. 지정한 웹뷰에 캔버스를 전달 하고 캔버스 내 비트맵에 화면을 그리도록 지정

https://developer.android.com/reference/android/view/View.html#draw(android.graphics.Canvas) 

draw

Added in API level 1

void draw (Canvas canvas)

Manually render this view (and all of its children) to the given Canvas. The view must have already done a full layout before this function is called. When implementing a view, implement onDraw(android.graphics.Canvas) instead of overriding this method. If you do need to override this method, call the superclass version.

aucd29 (218,390 포인트) 님이 2016년 7월 13일 답변
해당 방법도 해보긴 했으나 안되더라구요...ㅎ 웹뷰에 관한 layter type을 애초에 지정해야 가능한가봐요 ㅎ
현재 테스트 단말이 롤리팝 이상이면

if (Build.VERSION.SDK_INT >= 21) {
        webview.enableSlowWholeDocumentDraw ();
}
 
를 넣어보세요
네 넣어봤습니다만...잘 안되서... 결국 그냥 script로 저장시 background를 넣는 방법으로 해결했네요ㅠㅜ 결국 저한테는 미해결문제로...
이런 이런 -_ -            .
제가 이해하기로는
enableSlowWholeDocumentDraw  이 메소드가 html load하는것과 캔버스 저장을 가능케 하는거로 알고 있는데 맞나요ㅠ? 5.0부터 지원하는?
...