2014-01-08 24 views
10

WebViewのロード後にWebViewをスナップショットします。しかし、onPageFinishedを使用してもレンダリングが完了していないので、返されたビットマップは常にnullです。 私はインターネットで検索し、人々はWebView.PictureListenerを使用することを提案しますが、この機能はAPI12で推奨されていませんあなたはWebChromeClientを使用してonProgressChangedを実装してみてください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(); 
     } 
    } 
} 

答えて

2

最後に、この問題について非常に詳しく説明しました。これはなぜそれが常にnullビットマップを返すのかを説明します。

私のアプリ内のすべての変更は、私はすべてのあなたの助けのためのタッチイベント

感謝した後)のみ無効化を(トリガー修正版を思い付いたユーザアクションによってトリガーされます。

Android WebView renders blank/white, view doesn't update on css changes or HTML changes, animations are choppy

10

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 
      } 
     } 
}); 

EDIT:onPageStartedがよりロードされているかどうかを確認します1回より多い:

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

が動作しない、レンダリングは、私は上記のコード更新他に何? – lolyoshi

+0

= 100 newProgressが完了していませんが、それでも動作しません:( – lolyoshi

+0

あなたのonPageFinishedおよび/またはonPageStartedは複数回呼び出されますか、または1回だけですか? – 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) 
    } 

}

関連する問題