標籤:android應用 瀏覽器 介面 webview
在Android應用開發過程中,可能會遇到需要對整個介面或者某一部分進行的需求。Android中對View的也有很多中方式:
- 使用DrawingCache
- 直接調用View.draw
DrawingCache方法:如果使用DrawingCache,則對要的View有一個要求:View本身已經顯示在介面上。如果View沒有添加到介面上或者沒有顯示(繪製)過,則buildDrawingCache會失敗。這種方式比較適合對應用介面或者某一部分的。步驟很簡單:
view.setDrawingCacheEnabled(true);view.buildDrawingCache(); //啟用DrawingCache並建立位元影像Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); //建立一個DrawingCache的拷貝,因為DrawingCache得到的位元影像在禁用後會被回收view.setDrawingCacheEnabled(false); //禁用DrawingCahce否則會影響效能
View.draw方法:如果需要的View並沒有添加到介面上,可能是通過java代碼建立的或者inflate建立的,此時調用DrawingCache方法是擷取不到位元影像的。因為View在添加到容器中之前並沒有得到實際的大小(如果LayoutWidth是MatchParent,它還沒有Parent…),所以首先需要指定View的大小:
private void layoutView(View v, int width, int height) {// validate view.width and view.heightv.layout(0, 0, width, height);int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);// validate view.measurewidth and view.measureheightv.measure(measuredWidth, measuredHeight);v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());i}
然後View和其內部的子View都具有了實際大小,也就是完成了布局,相當與添加到了介面上。接著就可以建立位元影像並在上面繪製了:
int viewWidth = webView.getMeasuredWidth();int viewHeight = webView.getMeasuredHeight();if (viewWidth > 0 && viewHeight > 0) {b = Bitmap.createBitmap(viewWidth, viewHeight, Config.ARGB_8888);Canvas cvs = new Canvas(b);webView.draw(cvs);}
對於WebView的有一點特殊,網頁內容並不能在布局完成後立即渲染出來,因為WebView大小的變化就相當與案頭瀏覽器視窗大小的變化,Webkit需要根據視窗大小重新渲染所有的內容,這最多大概需要300ms的時間(對於不同效能的裝置、網頁複雜程度和Webkit版本可能不同)。如果建立背景WebView需要的話,應該在建立時就對其進行布局操作,這樣載入完成後大部分就已經渲染完畢了(除非有非同步js處理)。
Android應用兩種方法