Android 擷取View,獲取View的Bitmap的方法
阿新 • • 發佈:2019-01-04
需求
- 使用者在一個Layout中編輯文字和圖片。當用戶點選儲存按鈕時,需要將layout裡的所有view以一張圖片的形式儲存並顯示。
- 這篇文章主要說的是如何獲取View的Bitmap。bitmap的儲存和顯示不在此文討論。
方案一:使用系統API
- 優點:簡單,不易崩潰
- 缺點:有可能得到null的bitmap。(原因是裝置不同,顯示的View也會不同,如果設定固定大小的View,當用戶裝置最大能承載的size也小於View生成的Bitmap的size時,就無法得到Bitmap)
得到null的原始碼解釋
if (width <= 0 || height <= 0 ||
// Projected bitmap size in bytes
(width * height * (opaque && !use32BitCache ? 2 : 4) >
ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {
destroyDrawingCache();
mCachingFailed = true ;
return;
}
- 獲得Bitmap的封裝的靜態方法
public static Bitmap loadBitmapFromViewBySystem(View v) {
if (v == null) {
return null;
}
v.setDrawingCacheEnabled(true);
v.buildDrawingCache();
Bitmap bitmap = v.getDrawingCache();
return bitmap;
}
方案二:自己在Canvas上畫圖,並得到Canvas上的Bitmap
- 優點: 經測試,沒有遇到Null的時候
- 缺點: 不是系統方案,可能會導致其它問題,暫時沒有發現有副作用。
- 獲得Bitmap的封裝的靜態方法
public static Bitmap loadBitmapFromView(View v) {
if (v == null) {
return null;
}
Bitmap screenshot;
screenshot = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(screenshot);
canvas.translate(-v.getScrollX(), -v.getScrollY());//我們在用滑動View獲得它的Bitmap時候,獲得的是整個View的區域(包括隱藏的),如果想得到當前區域,需要重新定位到當前可顯示的區域
v.draw(canvas);// 將 view 畫到畫布上
return screenshot;
}