1. 程式人生 > >Android 擷取View,獲取View的Bitmap的方法

Android 擷取View,獲取View的Bitmap的方法

需求

  • 使用者在一個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;
    }