標籤:des android style io color ar os 使用 java
現在一般的購物網站,在你完成交易後都會將頁面拍照以免日後發生商務糾紛,而對於我們移動開發人員這個傳統互連網上的優秀經驗也同樣給了我們一些設計上的啟迪,接下來我將幾種實現思路寫出來供大家參考。
方案一:使用WebViewClient的onPageFinished事件
我們使用WebView當做程式裡的內嵌式瀏覽器的顯示網頁的時候,如果不進行特殊設定,當使用者點擊WebView裡面的連結就會另外啟動Android手機內建的瀏覽器,而離開當前的Activity,針對這一問題,我們可以進行自訂瀏覽器的用戶端設定,代碼如下:
- mWebView.setWebViewClient(new WebViewClient(){
-
- });
在setWebViewClient()的內容時,我們可以重寫onPageFinished()來捕捉WebView載入完畢的事件,關鍵代碼如下:
- /* WebView取得WebSettings */
- WebSettings webSettings = wView.getSettings();
- /* 設定能運行JavaScript */
- webSettings.setJavaScriptEnabled(true);
-
- /* */
- /* */
- /* WebView設定WebViewClient */
- wView.setWebViewClient(new WebViewClient(){
- @Override
- public void onPageFinished(WebView view, String url) {
- /* 擷取畫面 */
- Picture picture = view.capturePicture();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- /* 擷取寬高 */
- int width = picture.getWidth();
- int height = picture.getHeight();
- if (width > 0 && height > 0) {
- Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- picture.draw(canvas);
- bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);
- FileOutputStream fos = null;
- try {
- if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
- fos = new FileOutputStream(Environment.getExternalStorageDirectory());
- if (fos!=null) {
- bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
- fos.close();
- Toast.makeText(ATestActivity.this, "快照儲存成功",Toast.LENGTH_LONG).show();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- super.onPageFinished(view, url);
- }
- });
方案二:
使用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)實現。
- public static Bitmap convertViewToBitmap(View view){
- view.buildDrawingCache();
- Bitmap bitmap = view.getDrawingCache();
- return bitmap;
- }
一般情況下,直接使用上面方法是能夠正常的工作。但有時候,產生Bitmap會出現問題(Bitmap全黑色)。主要原因是drawingCache的值大於系統給定的值。我們可以看一下buildDrawingCache()方法中的一段代碼:
- if (width <= 0 || height <= 0 ||(width * height * (opaque && !translucentWindow ? 2 : 4) > ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {
- destroyDrawingCache();
- return;
- }
上面的代碼中,width和height是所要cache的view繪製的寬度和高度,所以(width * height * (opaque && !translucentWindow ? 2 : 4) 計算的是當前所需要的cache大小。ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系統所提供的最大的DrawingCache的值。當所需要的drawingCache >系統所提供的最大DrawingCache值時,產生Bitmap就會出現問題,此時擷取的Bitmap就為null。
所以在只需要修改所需的cache值就可以解決問題了。代碼實現如下:
- public static Bitmap convertViewToBitmap(View view){
- view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
- view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
- view.buildDrawingCache();
- Bitmap bitmap = view.getDrawingCache();
-
- return bitmap;
- }
實現Android 版網頁快照功能