首頁 > 軟體

Android實現將View轉化為圖片並儲存到本地

2022-02-16 10:05:13

本文範例為大家分享了Android將View轉化為圖片並儲存到原生的具體程式碼,供大家參考,具體內容如下

一、概述

app中有需求需要將View轉化為圖片並儲存到本地,這裡分兩種情況:

1.View本身已經顯示在介面上
2.View還沒有新增到介面上或者沒有顯示(繪製)過

二、實現方法

對於上述的第一種情況我使用下面程式碼即可:

private void viewSaveToImage(View view) {
        view.setDrawingCacheEnabled(true);
        view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
        view.setDrawingCacheBackgroundColor(Color.WHITE);

        // 把一個View轉換成圖片
        Bitmap cachebmp = loadBitmapFromView(view);

        FileOutputStream fos;
        String imagePath = "";
        try {
            // 判斷手機裝置是否有SD卡
            boolean isHasSDCard = Environment.getExternalStorageState().equals(
                    android.os.Environment.MEDIA_MOUNTED);
            if (isHasSDCard) {
                // SD卡根目錄
                File sdRoot = Environment.getExternalStorageDirectory();
                File file = new File(sdRoot, Calendar.getInstance().getTimeInMillis()+".png");
                fos = new FileOutputStream(file);
                imagePath = file.getAbsolutePath();
            } else
                throw new Exception("建立檔案失敗!");

            cachebmp.compress(Bitmap.CompressFormat.PNG, 90, fos);

            fos.flush();
            fos.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        LogUtil.e("imagePath="+imagePath);

        view.destroyDrawingCache();
    }

    private Bitmap loadBitmapFromView(View v) {
        int w = v.getWidth();
        int h = v.getHeight();

        Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bmp);

        c.drawColor(Color.WHITE);
        /** 如果不設定canvas畫布為白色,則生成透明 */

        v.layout(0, 0, w, h);
        v.draw(c);

        return bmp;
 }

如果是第二種,還這樣使用的話,就會報錯了,因為View在新增到容器中之前並沒有得到實際的大小,所以首先需要指定View的大小:

DisplayMetrics metric = new DisplayMetrics();
                    getWindowManager().getDefaultDisplay().getMetrics(metric);
                    int width = metric.widthPixels;     // 螢幕寬度(畫素)
                    int height = metric.heightPixels;   // 螢幕高度(畫素)
                    View mingpianView = LayoutInflater.from(this).inflate(R.layout.view_team_mingpian, null, false);
                    layoutView(mingpianView, width, height);
//然後View和其內部的子View都具有了實際大小,也就是完成了佈局,相當與新增到了介面上。接著就可以建立點陣圖並在上面繪製了:
    private void layoutView(View v, int width, int height) {
        // 整個View的大小 引數是左上角 和右下角的座標
        v.layout(0, 0, width, height);
        int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
        int measuredHeight = View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.AT_MOST);
        /** 當然,measure完後,並不會實際改變View的尺寸,需要呼叫View.layout方法去進行佈局。
         * 按範例呼叫layout函數後,View的大小將會變成你想要設定成的大小。
         */
        v.measure(measuredWidth, measuredHeight);
        v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
    }

然後再呼叫viewSaveToImage(mingpianView);方法即可。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com