Android WebView 캡 처 기능 구현

5923 단어 AndroidWebView캡 처
본 논문 의 사례 는 안 드 로 이 드 가 캡 처 기능 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
먼저 핸드폰 자체 의 긴 캡 처 기능 을 살 펴 보 자.  기종:vivo x9 plus
      
대담 하 게 추측 하여 논 리 를 실현 하 다.        
 1:스크롤 가능 한 View 가 필요 합 니 다.    
 2:화면 에 보 이 는 View 내용 캡 처        
 3:View 를 계속 스크롤 하고 View 가 렌 더 링 한 내용 을 캡 처 하여 용기 에 저장 합 니 다.            
 4:용기 에 있 는 그림 을 순서대로 조립 합 니 다.        
 5.저장
 우리 가 추측 하 는 논리 에 따라 한 걸음 한 걸음 실현 된다.
1.WebView 컨트롤 을 소개 대상 으로 합 니 다.

<WebView 
 android:id="@+id/web_view" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent"/> 
2.View 렌 더 링 내용 가 져 오기

//1:       
view.setDrawingCacheEnabled(true); 
//2:     
Bitmap drawingCache = view.getDrawingCache(); 
//3:    (              ) 
Bitmap newBitmap = Bitmap.createBitmap(drawingCache); 
//4:       
view.setDrawingCacheEnabled(false); 
3.View 를 계속 스크롤 하고 View 가 렌 더 링 한 내용 을 캡 처 하여 용기 에 저장 합 니 다.
굴 리 는 법

//    View    
webView.setScrollY(); 
webView.scrollTo(); 
webView.scrollBy(); 
매번 몇 거 리 를 굴 립 니까?
만약 에 우리 의 WebView 가 화면 을 가득 채 웠 다 고 가정 하면 getDrawingCache()방법 을 통 해 WebView 가 화면 에 보 여 주 는 내용 을 가 져 오 는 것 입 니 다.그러면 WebView 컨트롤 의 높이 는 우리 가 구 를 때마다 거 리 를 두 는 것 입 니 다.
몇 번 굴 러 요?
스크롤 횟수=WebView 콘 텐 츠 의 높이/WebView 컨트롤 의 높이+1(나머지 가 있 는 경우 1 회 더 스크롤)
가설:내용 높이 는 3840 이 고 컨트롤 높이 는 1920 이다.그러면 우 리 는 두 번,두 번 캡 처 만 하면 된다.
내용 높이 는 4000 이 고 컨트롤 높이 는 1920 이 며 160 높이 가 캡 처 되 지 않 습 니 다.캡 처 3 회 가 필요 합 니 다.모든 스크롤 횟수 는+1 이 필요 합 니 다.
핵심 코드:

//1:     
mWebView.measure(0, 0); 
//2:        == Webview    
int contentHeight = mWebView.getMeasuredHeight(); 
//3:  Webview      
int height = mWebView.getHeight(); 
//4:       
int totalScrollCount = contentHeight / height; 
//5:      
int surplusScrollHeight = contentHeight - (totalScrollCount * height); 
 
//       
List<Bitmap> cacheBitmaps = new ArrayList<>(); 
for (int i = 0; i < totalScrollCount; i++) { 
 if (i > 0) { 
  //  WebView 
  mWebView.setScrollY(i * height); 
 } 
 //    ,    1  ,        
 Bitmap bitmap = getScreenshot(mWebView); 
 cacheBitmaps.add(bitmap); 
} 
 
//      ,      1  
if (surplusScrollHeight > 0) { 
 mWebView.setScrollY(contentHeight); 
 Bitmap bitmap = getScreenshot(mWebView); 
 cacheBitmaps.add(bitmap); 
} 
4.조립 사진
  안 타 깝 게 도 구 글 은 사진 을 조립 하 는 api 를 제공 하지 않 았 습 니 다.모든 것 은 우리 가 직접 그 려 야 합 니 다.
  what? 자기 그림?
 맞아요.자기가 그린 거 예요.안 드 로 이 드 에서 그림 을 그 리 는 거 예요.현실 세계 의 그림 그 리 는 절차 와 똑 같 아 요.똑 같이 종이,화판,붓 을 먼저 준비 해 야 해 요.
핵심 코드:    

public Bitmap mergeBitmap(List<Bitmap> datas) { 
 //    (     ,           ) 
 int bitmapWidth = datas.get(0).getWidth(); 
 //     = WebView      
 int bitmapHeight = contentHeight; 
 //1:     
 Bitmap bimap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.RGB_565); 
 //2:    ,      
 Canvas canvas = new Canvas(bimap); 
 //3:     
 Paint paint = new Paint(); 
 for (int count = datas.size(), i = 0; i < count; i++) { 
  Bitmap data = datas.get(i); 
  float left = 0; 
  float top = i * data.getHeight(); 
  Rect src = null; 
  RectF des = null; 
  /** 
  * Rect src = new Rect();          
  * RectF des = new RectF();   Canvas     (    ) 
  */ 
  if (i == count - 1 && surplusScrollHeight > 0) { 
  int srcRectTop = data.getHeight() - surplusScrollHeight; 
  src = new Rect(0, srcRectTop, data.getWidth(), data.getHeight()); 
  des = new RectF(left, top, data.getWidth(), top + surplusScrollHeight); 
  } else { 
  src = new Rect(0, 0, data.getWidth(), data.getHeight()); 
  des = new RectF(left, top, data.getWidth(), top + data.getHeight()); 
  } 
  //     
  canvas.drawBitmap(data, src, des, paint); 
 } 
 return bimap; 
} 
canvas.drawBitmap()두 Rect 에 대한 개인 적 인 이해:
src:그림 의 크기 를 표시 하 시 겠 습 니까?전부 표시 하 시 겠 습 니까?반 만 표시 하 시 겠 습 니까?
        
 그림 을 예 로 들 면:
 new Rect(0,0,bitmap.getWidth()/2,bitmap.getHeight())  그림 너비 반 크기 보이 기
     
new Rect(0,0,bitmap.getWidth()/2,bitmap.getHeight()/2)는 1/4 의 그림 크기 를 표시 합 니 다.
          
des:src 그림 을 어느 위치 에 표시 할 지,왼쪽,오른쪽,가운데 에 표시 할 지 대표 합 니 다.     
 
그림 을 예 로 들 면(도면 은 Canvas,그림 은 Bitmap):
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()왼쪽 상단 표시

new Rect(0,도면 높이/2,bitmap.getWidth(),bitmap.getHeight()가운데 표시

5.저장
로 컬 에 저장,통과 가능 bimap.copress()방법
데모 데모:
     
Github 주소:   ScreenshotExample   부족 한 점:
WebView 내용 이 너무 길 어 서 는 안 됩 니 다.그렇지 않 으 면 그림 이 너무 많아 서 합 쳐 지면 메모리 가 넘 칠 위험 이 있 습 니 다.
WebView 의 html 에는 떠 있 는 태그 가 있 지 않 습 니 다.그렇지 않 으 면 캡 처 할 때마다 태그 의 내용 을 캡 처 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기