2016-07-18 16 views
-1

Ich habe eine Frage. Wenn ich eine Capture-Webansicht erhalte, wird der Canvas-Bereich nicht in meinem Tablet erfasst ... aber der Inhalt ist in Ordnung. Ich verstehe nicht ... aber seltsame Sache ist ...Wie kann ich html5 Leinwand in Android Webview erfassen?

Wenn ich Option 'webView.setLayerType (WebView.LAYER_TYPE_SOFTWARE, null);' Stiftdaten (Leinwand) erscheinen nach speichern, aber die Zeichnung ist wirklich sehr, sehr langsam ...

Es ist meine Quelle ist ..

@SuppressLint("SetJavaScriptEnabled") 
private void setWebviewInit(WebView webview) { 
    webview.setInitialScale(1); 
    webview.getSettings().setJavaScriptEnabled(true); 
    webview.getSettings().setUseWideViewPort(true); 
    webview.getSettings().setLoadWithOverviewMode(true); 

    webview.getSettings().setSupportZoom(true); 
    webview.getSettings().setBuiltInZoomControls(true); 
    webview.getSettings().setDisplayZoomControls(false); 

    webview.setWebViewClient(webviewclient); 
    webview.setWebChromeClient(new WebviewAlert()); 
    webview.setWebChromeClient(new ChromeClient(this)); 
    webview.addJavascriptInterface(new JIFace(), "ezandroid"); 
} 

// erfassen

 WebView webview = arrWebView.get(0); 

    webview.measure(MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED),MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
    webview.layout(0, 0, webview.getMeasuredWidth(), webview.getMeasuredHeight()); 
    webview.setDrawingCacheEnabled(true); 
    webview.buildDrawingCache(); 
    Bitmap bitmap = Bitmap.createBitmap(webview.getMeasuredWidth(), webview.getMeasuredHeight(),Bitmap.Config.ARGB_8888); 

    Canvas canvas = new Canvas(bitmap); 
    Paint paint = new Paint(); 
    int height = bitmap.getHeight(); 
    canvas.drawBitmap(bitmap, 0, height, paint); 
    webview.draw(canvas); 

    if(penBitmap != null){ 
     bitmap = combineBitmaps(bitmap, penBitmap, OVERLAY); 
    } 
    int fullHeight = webview.getMeasuredHeight(); 
    int pageHeight = (int) (1122*WEBVIEW_SCALE_RATE); 
    int croppedStart = 0; 

    int cnt; 
    if(fullHeight == pageHeight){ 
     cnt =1; 
    }else{ 
     cnt = (fullHeight/pageHeight) + 1; 
    } 

    ArrayList<String> localFilePath = new ArrayList<String>(); 

    for (int i = 0; i < cnt + 1; i++) { // 0: full Img, else: cropped 
     Bitmap croppedBitmap = null; 
     if (i!=cnt) { 
      if ((croppedStart + pageHeight) > webview.getMeasuredHeight()) { 
       int lastHeight = webview.getMeasuredHeight() - croppedStart; 
       croppedBitmap = Bitmap.createBitmap(bitmap, 0, croppedStart, webview.getMeasuredWidth(),lastHeight-1); 
      } else { 
       try{ 
       croppedBitmap = Bitmap.createBitmap(bitmap, 0, croppedStart, webview.getMeasuredWidth(), pageHeight); 
       }catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 
      croppedStart += pageHeight; 
     } 
     if (bitmap != null) { 
      try { 
       String filePath = Environment.getExternalStorageDirectory().toString(); 
       OutputStream out = null; 
       File file = new File(filePath, "test"); 
       if(!file.exists()){ 
        file.mkdir(); 
       } 
       out = new FileOutputStream(filePath + "/test/consentImg" + i + ".jpeg"); 
       localFilePath.add(filePath + "/test/consentImg" + i + ".jpeg"); 

       if(i==cnt){ 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
       }else{ 
        croppedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
       } 

       if(croppedBitmap != null){ 
        croppedBitmap.recycle(); 
        croppedBitmap = null; 
       } 
       out.flush(); 
       out.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    bitmap.recycle(); 

Antwort

0

Ungelöst. beim Speichern, mache ich ein Bild, dann stelle ich es auf den Hintergrund von webview ...

0

Sie müssen WebView anrufen .enableSlowWholeDocumentDraw() vor dem Erstellen von WebViews.

@Override 
@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     WebView.enableSlowWholeDocumentDraw(); 
    } 
    ... 
    setContentView(layout); 
    ... 
    ... 
} 
+0

yep ich habe es bereits versucht ... aber immer noch nicht funktioniert. – Adrian

+0

Sie müssen auch die Code-Zeichnung Webview in Block hinzufügen, wo Seite fertig geladen: 'webView.setWebViewClient (neue WebViewClient() {öffentliche void onPageFinished (WebView Ansicht, String URL) {/ Canvas zeichnen}}' – phongvan

+0

Canvas existieren mit HTML. und ich klicke auf die btn nach dem Laden der Seite .. Ich verstehe nicht .. aber diese Option ist zu langsam .. (Software) – Adrian

1

Einfach WebView.enableSlowWholeDocumentDraw() hinzufügen ist nicht genug, habe ich noch leere Bilder auf meiner SD-Karte gespeichert. Nach einer guten Portion Googeln fand ich die Lösung. Sie müssen Hardwarebeschleunigung für die Webansicht wie folgt deaktivieren:

mWebview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);