2014-01-08 35 views
10

我想在加載WebView後快照WebView。但是,返回的位圖始終爲空,因爲儘管使用了onPageFinished,但渲染未完成加載。 我在互聯網搜索和人們建議使用WebView.PictureListener,但此功能已在API 12中棄用。Android Webview:在完成呈現時檢測到

一些代碼

public class MainActivity extends Activity { 
    private WebView mButterflyWebView; 

    /** 
    * Gets html content from the assets folder. 
    */ 
    private String getHtmlFromAsset() { 
     InputStream is; 
     StringBuilder builder = new StringBuilder(); 
     String htmlString = null; 
     try { 
      is = getAssets().open(getString(R.string.butterfly_html)); 
      if (is != null) { 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(is)); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        builder.append(line); 
       } 

       htmlString = builder.toString(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return htmlString; 
    } 

    /** 
    * Initializes views, controls... 
    */ 

    private void init() { 
     mButterflyWebView = (WebView) findViewById(R.id.butterfly_webview); 

     mButterflyWebView.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int newProgress) { 


      if (newProgress == 100){ 
       if (capturePictureWebView() != null){ 
        saveBitmapToFile(capturePictureWebView()); 
       } 
      } 
     } 
    }); 

    } 

    /** 
    * Loads html page with the content. 
    */ 
    private void loadHtmlPage() { 
     String htmlString = getHtmlFromAsset(); 
     if (htmlString != null) 
      mButterflyWebView.loadDataWithBaseURL(
        "file:///android_asset/images/", htmlString, "text/html", 
        "UTF-8", null); 

     else 
      Toast.makeText(this, R.string.no_such_page, Toast.LENGTH_LONG) 
        .show(); 
    } 

    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     init(); 
     loadHtmlPage(); 
    } 

    private Bitmap capturePictureWebView() { 
     mButterflyWebView.measure(MeasureSpec.makeMeasureSpec(
       MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED), 
       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
     mButterflyWebView.layout(0, 0, mButterflyWebView.getMeasuredWidth(), 
       mButterflyWebView.getMeasuredHeight()); 
     mButterflyWebView.setDrawingCacheEnabled(true); 
     mButterflyWebView.buildDrawingCache(); 

     if (mButterflyWebView.getMeasuredWidth() == 0 || mButterflyWebView.getMeasuredHeight() == 0){ 
      return null; 
     } 
     Bitmap bm = Bitmap.createBitmap(720, 1280, Bitmap.Config.ARGB_8888); 

     System.out.println("width=" + mButterflyWebView.getMeasuredWidth()); 
     System.out.println("height=" + mButterflyWebView.getMeasuredHeight()); 
     Canvas bigcanvas = new Canvas(bm); 
//  bigcanvas.scale(720/mButterflyWebView.getMeasuredWidth(), 1280/mButterflyWebView.getMeasuredHeight()); 
     Paint paint = new Paint(); 
     int iHeight = bm.getHeight(); 
     bigcanvas.drawBitmap(bm, 0, iHeight, paint); 
     mButterflyWebView.draw(bigcanvas); 
     return bm; 
    } 

    private void saveBitmapToFile(Bitmap bitmap) { 
     try { 

      FileOutputStream out = new FileOutputStream("/storage/sdcard0/a.png"); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); 
      out.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

回答

10

你應該嘗試使用WebChromeClient和實施onProgressChanged

http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView,INT)

mButterflyWebView.setWebChromeClient(new WebChromeClient() { 

     @Override 
     public void onProgressChanged(WebView view, int progress) { 
      if (progress == 100) { 
       // do screenshot 
      } 
     } 
}); 

編輯:檢查是否onPageStarted加載更多比一次:

mButterflyWebView.setWebViewClient(new WebViewClient() { 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      Log.d("WebView", "onPageStarted " + url); 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      Log.d("WebView", "onPageFinished " + url); 
     } 
    }); 
+4

不工作,呈現尚未完成雖然newProgress = 100什麼? – lolyoshi

+0

我上面的代碼更新,但它仍然不起作用:( – lolyoshi

+0

你的onPageFinished和/或onPageStarted被稱爲多次,或只是一次? – Andros

-1
private class CfdWebViewClient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     Log.v(TAG, "shouldOverrideUrlLoading: " + url);; 
     return true; 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 
     Log.v(TAG, "onPageFinished: " + url); 

     // do something 
    } 
} 
+0

有什麼不同? – lolyoshi

+0

當我寫回答時,上面沒有另一個答案。所以我們都給了你同樣的答案:) – Martin

3

你可以像這樣做,在你的WebView:

@Override 
public void invalidate() { 
    super.invalidate(); 

    if (getContentHeight() > 0) { 
     // WebView has displayed some content and is scrollable. 
    } 
} 

感謝:https://stackoverflow.com/a/14678910/1310343

1

,最好的方法來檢測,如果一個頁面渲染的是使用onPageCommitVisible回調,可從API 23獲得。onPageLoadFinished不適用,因爲它交付得太快(處理HTML時,但尚未呈現)。

webview.setWebViewClient(新WebViewClient(){

@Override 
    public void onPageCommitVisible (WebView view, 
      String url) 
    } 

}

相關問題