English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Hybrid App에서 웹 부분의 공유 방식은 점점 다양화되고 있습니다. 가장 일반적인 사용자操作 방식으로는 웹 페이지 링크를 복사하는 방식, 목표 애플리케이션을 선택하여 자동으로 공유하는 방식 등이 있습니다. 그 중, 스크린샷 행동은 사용자 operation을 풍부하게 하고 사용자에게 사랑받는 인터랙티브 방식 중 하나로 자리잡고 있습니다. 이러한 기능은 많은 콘텐츠 커뮤니티 애플리케이션에서 볼 수 있습니다. 이 기사는 Android 애플리케이션에서 WebView 스크린샷의 구현 방식을 요약합니다.
WebView는 특별한 컨트롤이므로, 다른 시스템 View나 스크린샷 방식처럼截图을 얻을 수 없습니다(주로 장문의 스크린샷을 얻는 경우가 많습니다). 예를 들어:
public static Bitmap getScreenShot(View view){ View screenView = view.getRootView(); screenView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); screenView.setDrawingCacheEnabled(false); return bitmap; }
위 코드를 WebView에 적용하면 내용이 불complete한 스크린샷을 얻게 됩니다. 실제로, WebView 시스템 자체는 Bitmap 객체를 얻기 위한对应的 API를 제공합니다.
private Bitmap captureWebView(WebView webView){ Picture picture = webView.capturePicture(); int width = picture.getWidth(); int height = picture.getHeight(); if (width > 0 && height > 0) { Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); picture.draw(canvas); return bitmap; } return null; }
Bitmap 객체를 얻은 후, 이 코드를 사용하여 그를 장치의 저장 카드에 저장할 수 있습니다:
private void saveBitmap(Bitmap bitmap){ File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()) + ".jpg"); try { FileOutputStream fos = new FileOutputStream(file); bitmap.compress(CompressFormat.JPEG, 8(0, fos); fos.flush(); fos.close(); } catch (java.io.IOException e) { e.printStackTrace(); } }
간단한 두 단계만으로 완료됩니다. 그러나 Android 50 및 이상 버전의 시스템 장치에서 작업할 때, 캡처 이미지는 완전하지 않게 보일 수 있습니다. 그래서, 이미지의 너비와 높이는 실제 요구 사항에 맞지만, 내용은 현재 화면 영역 내 WebView의 내용만 포함됩니다.
이유는 Android 50.0부터, 시스템은 일부 Html 문서를 렌더링할 수 있게 되었습니다. 따라서, 기본적으로 우리는 일부 화면 영역 내 WebView의 내용만 캡처할 수 있으며, 이 문제가 발생합니다.
하지만, 시스템은 이 기본 최적화 행동을 수정할 수 있는对应的 API를 제공합니다. 코드는 매우 간단합니다:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { WebView.enableSlowWholeDocumentDraw(); }
주의해야 할 것은 이 코드가 WebView 인스턴스가 생성되기 전에 추가되어야 한다는 것입니다. Activity를 사용하는 경우 setContentView() 메서드 앞에 추가합니다.
capturePicture() 메서드는 WebView 캡처를 가져오지만, API 19 이 메서드는 시스템에서 폐기되었습니다. 대신 onDraw() 메서드를 사용하여 Bitmap 객체를 가져옵니다.
private Bitmap captureWebView(WebView webView){ float scale = webView.getScale(); int width = webView.getWidth(); int height = (int) (webView.getHeight()) * scale); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); webView.draw(canvas); return bitmap; }
이를 다시 말해서, getScale() 메서드는 API 17 시스템에서도 버림되었기 때문에 scale 값을 가져오는 또 다른 더 우아한 방법은 다음과 같습니다:
webView.setWebViewClient(new WebViewClient() { @Override public void onScaleChanged(WebView view, float oldScale, float newScale){ super.onScaleChanged(view, oldScale, newScale); scale = newScale; } });
실제 사용 과정에서는 Bitmap의 메모리 사용 문제를 고려하고, 예외를 처리하여 OOM이 발생하지 않도록 해야 합니다.
결론
위에 설명한 것은 저가 여러분에게 소개한 Android 중 WebView 캡처의 구현 방법입니다. 여러분에게 도움이 되길 바랍니다. 어떤 질문이든 제게 댓글을 남겨 주시면, 저는 즉시 답변을 드리겠습니다. 또한, 노래 튜토리얼에 대한 여러분의 지지에 깊이 감사드립니다!
고지: 본문은 인터넷에서 가져왔으며, 저작권자는 본 사이트가 소유하지 않으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 본 사이트는 인공 편집을 하지 않았으며, 관련 법적 책임을 부담하지 않습니다. 저작권 침해 내용이 있음을 발견하시면, notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com에 이메일을 보내면(#을 @으로 변경해 주세요) 신고하시고 관련 증거를 제공하시면, 확인되면 즉시 저작권 침해 내용을 삭제하겠습니다.