Android 不可見View生成Bitmap轉圖片顯示

1.異步加載佈局上的圖片顯示

使用加載方式Glide

    implementation('com.github.bumptech.glide:glide:4.7.1') {
        exclude group: "com.android.support"
    }
    annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'

2.測試佈局activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:text="可以點擊"
        android:textColor="@color/colorPrimary"
        android:textSize="18sp" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:id="@+id/rl"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:id="@+id/ll_top"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:background="@color/colorPrimary">

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:text="@string/app_name"
                    android:textColor="@color/colorAccent" />

            </LinearLayout>

            <ImageView
                android:id="@+id/iv_show"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@mipmap/ic_launcher" />

        </RelativeLayout>

        <LinearLayout
            android:id="@+id/ll_bottom"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:orientation="vertical"
            android:background="@color/colorAccent">

            <ImageView
                android:id="@+id/iv_show2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@mipmap/ic_launcher" />

        </LinearLayout>

    </RelativeLayout>
</LinearLayout>

3.傳異步加載圖片

3.1計算view的大小
    public void measureSize(Activity activity, String url) {
        //將佈局轉化成view對象
        View viewBitmap = LayoutInflater.from(activity).inflate(R.layout.activity_second, null);
        View viewById = viewBitmap.findViewById(R.id.rl);
        WindowManager manager = activity.getWindowManager();
        DisplayMetrics outMetrics = new DisplayMetrics();
        manager.getDefaultDisplay().getMetrics(outMetrics);
        int width = outMetrics.widthPixels;
        int height = outMetrics.heightPixels;

        //然後View和其內部的子View都具有了實際大小,也就是完成了佈局,相當與添加到了界面上。接着就可以創建位圖並在上面繪製了:
        layoutView(viewById, width, height, url, activity);
    }
3.2填充佈局內容
    public void layoutView(final View viewBitmap, int width, int height, String url, Activity activity) {
        // 整個View的大小 參數是左上角 和右下角的座標
        viewBitmap.layout(0, 0, width, height);
        int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
        int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST);

    viewBitmap.measure(measuredWidth, measuredHeight);
    viewBitmap.layout(0, 0, viewBitmap.getMeasuredWidth(), viewBitmap.getMeasuredHeight());

    final ImageView imageView = viewBitmap.findViewById(R.id.iv_show);

    //注意加載網絡圖片時一定要用SimpleTarget回調
    Glide.with(activity).asBitmap().load(url).into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
            imageView.setImageBitmap(resource);
            Bitmap bitmap = viewSaveToImage(viewBitmap);
            ivShow2.setImageBitmap(bitmap);

            llBottom.setBackgroundColor(Color.parseColor("#dddddd"));
        }
    });
}
3.3把view轉成圖片
private Bitmap viewSaveToImage(View view) {
    view.setDrawingCacheEnabled(true);
    view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    view.setDrawingCacheBackgroundColor(Color.WHITE);

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

//        if (mBitmapDoneListener != null){
//            mBitmapDoneListener.bitmapDone(cachebmp);
//        }

    view.destroyDrawingCache();

    return cachebmp;
}
3.4view轉bitmap
 public Bitmap viewConversionBitmap(View v) {
        int w = v.getWidth();
        int h = v.getHeight();

        if (w <=0 || h<=0) {
            Toast.makeText(this, "view's width or height are <= 0", Toast.LENGTH_SHORT).show();
            return null;
        }


        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;
    }
3.5 把上面獲得的bitmap傳進來就可以得到圓角的bitmap了
public void bitmapInBitmap(Bitmap bitmap, ImageView imageView) {
    Bitmap tempBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
    Canvas canvas = new Canvas(tempBitmap);

    //圖像上畫矩形
    Paint paint = new Paint();
    paint.setColor(Color.TRANSPARENT);
    paint.setStyle(Paint.Style.STROKE);//不填充
    paint.setStrokeWidth(10);  //線的寬度
    canvas.drawRect(10, 20, 100, 100, paint);
    imageView.setImageBitmap(tempBitmap);

    //畫中畫
    Paint photoPaint = new Paint(); // 建立畫筆
    photoPaint.setDither(true); // 獲取跟清晰的圖像採樣
    photoPaint.setFilterBitmap(true);// 過濾一些

    Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());// 創建一個指定的新矩形的座標
    Rect dst = new Rect(0, 0, 300, 350);// 創建一個指定的新矩形的座標
    canvas.drawBitmap(tempBitmap, src, dst, photoPaint);// 將photo 縮放或則擴大到
    imageView.setImageBitmap(getRoundedCornerBitmap(tempBitmap));
}
3.6 生成圓角圖片
public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
    try {
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(),
                bitmap.getHeight());
        final RectF rectF = new RectF(new Rect(0, 0, bitmap.getWidth(),
                bitmap.getHeight()));
        //設置圓角大小
        final float roundPx = 30;
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(Color.BLACK);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        final Rect src = new Rect(0, 0, bitmap.getWidth(),
                bitmap.getHeight());
        canvas.drawBitmap(bitmap, src, rect, paint);
        return output;
    } catch (Exception e) {
        return bitmap;
    }
}

4.總結頁面顯示SecondActivity

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * Created by GetOn on 2019/3/11.
 */

public class SecondActivity extends AppCompatActivity {


    @BindView(R.id.btn)
    Button btn;
    @BindView(R.id.ll_bottom)
    LinearLayout llBottom;
    @BindView(R.id.ll_top)
    LinearLayout llTop;
    @BindView(R.id.iv_show)
    ImageView ivShow;
    @BindView(R.id.iv_show2)
    ImageView ivShow2;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_second);
        ButterKnife.bind(this);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                measureSize(SecondActivity.this, "http://www.pptbz.com/pptpic/UploadFiles_6909/201203/2012031220134655.jpg");

            }
        });


    }


    /**
     * 計算view的大小
     */
    public void measureSize(Activity activity, String url) {
        //將佈局轉化成view對象
        View viewBitmap = LayoutInflater.from(activity).inflate(R.layout.activity_second, null);
        View viewById = viewBitmap.findViewById(R.id.rl);
        WindowManager manager = activity.getWindowManager();
        DisplayMetrics outMetrics = new DisplayMetrics();
        manager.getDefaultDisplay().getMetrics(outMetrics);
        int width = outMetrics.widthPixels;
        int height = outMetrics.heightPixels;

        //然後View和其內部的子View都具有了實際大小,也就是完成了佈局,相當與添加到了界面上。接着就可以創建位圖並在上面繪製了:
        layoutView(viewById, width, height, url, activity);
    }

    /**
     * 填充佈局內容
     */
    public void layoutView(final View viewBitmap, int width, int height, String url, Activity activity) {
        // 整個View的大小 參數是左上角 和右下角的座標
        viewBitmap.layout(0, 0, width, height);
        int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
        int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST);

        viewBitmap.measure(measuredWidth, measuredHeight);
        viewBitmap.layout(0, 0, viewBitmap.getMeasuredWidth(), viewBitmap.getMeasuredHeight());

        final ImageView imageView = viewBitmap.findViewById(R.id.iv_show);

        //注意加載網絡圖片時一定要用SimpleTarget回調
        Glide.with(activity).asBitmap().load(url).into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                imageView.setImageBitmap(resource);
                Bitmap bitmap = viewSaveToImage(viewBitmap);
                ivShow2.setImageBitmap(bitmap);

                llBottom.setBackgroundColor(Color.parseColor("#dddddd"));
            }
        });
    }


    /**
     * 把view轉成圖片
     *
     * @param view
     */
    private Bitmap viewSaveToImage(View view) {
        view.setDrawingCacheEnabled(true);
        view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
        view.setDrawingCacheBackgroundColor(Color.WHITE);

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

//        if (mBitmapDoneListener != null){
//            mBitmapDoneListener.bitmapDone(cachebmp);
//        }

        view.destroyDrawingCache();

        return cachebmp;
    }


    /**
     * view轉bitmap
     */
    public Bitmap viewConversionBitmap(View v) {
        int w = v.getWidth();
        int h = v.getHeight();

        if (w <=0 || h<=0) {
            Toast.makeText(this, "view's width or height are <= 0", Toast.LENGTH_SHORT).show();
            return null;
        }


        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;
    }

    /**
     * 把上面獲得的bitmap傳進來就可以得到圓角的bitmap了
     */
    public void bitmapInBitmap(Bitmap bitmap, ImageView imageView) {
        Bitmap tempBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        Canvas canvas = new Canvas(tempBitmap);

        //圖像上畫矩形
        Paint paint = new Paint();
        paint.setColor(Color.TRANSPARENT);
        paint.setStyle(Paint.Style.STROKE);//不填充
        paint.setStrokeWidth(10);  //線的寬度
        canvas.drawRect(10, 20, 100, 100, paint);
        imageView.setImageBitmap(tempBitmap);

        //畫中畫
        Paint photoPaint = new Paint(); // 建立畫筆
        photoPaint.setDither(true); // 獲取跟清晰的圖像採樣
        photoPaint.setFilterBitmap(true);// 過濾一些

        Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());// 創建一個指定的新矩形的座標
        Rect dst = new Rect(0, 0, 300, 350);// 創建一個指定的新矩形的座標
        canvas.drawBitmap(tempBitmap, src, dst, photoPaint);// 將photo 縮放或則擴大到
        imageView.setImageBitmap(getRoundedCornerBitmap(tempBitmap));
    }

    /**
     * 生成圓角圖片
     */
    public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
        try {
            Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                    bitmap.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(output);
            final Paint paint = new Paint();
            final Rect rect = new Rect(0, 0, bitmap.getWidth(),
                    bitmap.getHeight());
            final RectF rectF = new RectF(new Rect(0, 0, bitmap.getWidth(),
                    bitmap.getHeight()));
            //設置圓角大小
            final float roundPx = 30;
            paint.setAntiAlias(true);
            canvas.drawARGB(0, 0, 0, 0);
            paint.setColor(Color.BLACK);
            canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            final Rect src = new Rect(0, 0, bitmap.getWidth(),
                    bitmap.getHeight());
            canvas.drawBitmap(bitmap, src, rect, paint);
            return output;
        } catch (Exception e) {
            return bitmap;
        }
    }
}

//備份使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章