實現Android 版網頁快照功能

來源:互聯網
上載者:User

標籤:des   android   style   io   color   ar   os   使用   java   

現在一般的購物網站,在你完成交易後都會將頁面拍照以免日後發生商務糾紛,而對於我們移動開發人員這個傳統互連網上的優秀經驗也同樣給了我們一些設計上的啟迪,接下來我將幾種實現思路寫出來供大家參考。

方案一:使用WebViewClient的onPageFinished事件

我們使用WebView當做程式裡的內嵌式瀏覽器的顯示網頁的時候,如果不進行特殊設定,當使用者點擊WebView裡面的連結就會另外啟動Android手機內建的瀏覽器,而離開當前的Activity,針對這一問題,我們可以進行自訂瀏覽器的用戶端設定,代碼如下:

 

  1. mWebView.setWebViewClient(new WebViewClient(){  
  2.   
  3. });  

 

在setWebViewClient()的內容時,我們可以重寫onPageFinished()來捕捉WebView載入完畢的事件,關鍵代碼如下:

  1.     /* WebView取得WebSettings */  
  2.     WebSettings webSettings = wView.getSettings();  
  3.     /* 設定能運行JavaScript */  
  4.     webSettings.setJavaScriptEnabled(true);  
  5.       
  6.     /*  */  
  7.     /*  */  
  8.     /* WebView設定WebViewClient */  
  9.     wView.setWebViewClient(new WebViewClient(){  
  10.         @Override  
  11.         public void onPageFinished(WebView view, String url) {  
  12.             /* 擷取畫面 */  
  13.             Picture picture = view.capturePicture();  
  14.             ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  15.             /* 擷取寬高 */  
  16.             int width = picture.getWidth();  
  17.             int height = picture.getHeight();  
  18.             if (width > 0 && height > 0) {  
  19.     Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);  
  20.     Canvas canvas = new Canvas(bitmap);  
  21.     picture.draw(canvas);  
  22.     bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);  
  23.     FileOutputStream fos = null;  
  24.     try {  
  25.         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {                            
  26.             fos = new FileOutputStream(Environment.getExternalStorageDirectory());  
  27.             if (fos!=null) {  
  28.                 bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);  
  29.                 fos.close();  
  30.                 Toast.makeText(ATestActivity.this, "快照儲存成功",Toast.LENGTH_LONG).show();  
  31.             }  
  32.         }  
  33.     } catch (Exception e) {  
  34.         e.printStackTrace();  
  35.     }  
  36. }  
  37.               
  38.             super.onPageFinished(view, url);  
  39.         }  
  40.     });  


方案二:

使用View的 Bitmap  getDrawingCached(boolean autoScale)方法實現,不過要注意的是cache先要通過setDrawingCacheEnable方法把cache開啟,然後再調用getDrawingCache方法就可以獲得view的cache圖片了。buildDrawingCache方法可以不用調用,因為調用getDrawingCache方法時,若果 cache沒有建立,系統會自動調用buildDrawingCache方法產生cache。若果要更新cache, 必須要調用destoryDrawingCache方法把舊的cache銷毀,才能建立新的。
當調用setDrawingCacheEnabled方法設定為false, 系統也會自動把原來的cache銷毀。
   ViewGroup在繪製子view時,而外提供了兩個方法
   void setChildrenDrawingCacheEnabled(boolean enabled)
   setChildrenDrawnWithCacheEnabled(boolean enabled)
   setChildrenDrawingCacheEnabled方法可以使viewgroup裡所有的子view開啟cache, setChildrenDrawnWithCacheEnabled使在繪製子view時,若該子view開啟了cache, 則使用它的cache進行繪製,從而節省繪製時間。
   擷取cache通常會佔用一定的記憶體,所以通常不需要的時候有必要對其進行清理,通過destroyDrawingCache或setDrawingCacheEnabled(false)實現。

 

  1. public static Bitmap convertViewToBitmap(View view){  
  2.        view.buildDrawingCache();  
  3.     Bitmap bitmap = view.getDrawingCache();  
  4.     return bitmap;   
  5. }  

 

一般情況下,直接使用上面方法是能夠正常的工作。但有時候,產生Bitmap會出現問題(Bitmap全黑色)。主要原因是drawingCache的值大於系統給定的值。我們可以看一下buildDrawingCache()方法中的一段代碼:

 

  1. if (width <= 0 || height <= 0 ||(width * height * (opaque && !translucentWindow ? 2 : 4) > ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {     
  2.                  destroyDrawingCache();     
  3.                  return;     
  4.   }    

 

上面的代碼中,width和height是所要cache的view繪製的寬度和高度,所以(width * height * (opaque && !translucentWindow ? 2 : 4) 計算的是當前所需要的cache大小。ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系統所提供的最大的DrawingCache的值。當所需要的drawingCache >系統所提供的最大DrawingCache值時,產生Bitmap就會出現問題,此時擷取的Bitmap就為null。

所以在只需要修改所需的cache值就可以解決問題了。代碼實現如下:

    1. public static Bitmap convertViewToBitmap(View view){  
    2.       view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
    3.         view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());  
    4.         view.buildDrawingCache();  
    5.         Bitmap bitmap = view.getDrawingCache();  
    6.   
    7.      return bitmap;  

實現Android 版網頁快照功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.