关于安卓保存海报实现

2020-03-11  本文已影响0人  有爱的梦_大东

保存海报到本地步骤

1.实现海报弹框布局

描述:自己写布局,这里就不做过多的说明

2.将布局转为bitmap

描述:将view转为bitmap可以在网上查我这里只写了我自己的方式和一些注意

代码:

 /**
     * 将view转为bitmap
     *
     * @param v
     * @return
     */
    public static Bitmap getViewBitmap(View v) {
        v.clearFocus();
        v.setPressed(false);
        boolean willNotCache = v.willNotCacheDrawing();
        v.setWillNotCacheDrawing(false);
        int color = v.getDrawingCacheBackgroundColor();
        v.setDrawingCacheBackgroundColor(0);
        if (color != 0) {
            v.destroyDrawingCache();
        }
        v.buildDrawingCache();
        Bitmap cacheBitmap = v.getDrawingCache();
        if (cacheBitmap == null) {
            return null;
        }
        Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
        v.destroyDrawingCache();
        v.setWillNotCacheDrawing(willNotCache);
        v.setDrawingCacheBackgroundColor(color);
        return bitmap;
    }

使用:val bitmap = ImageUtils.getViewBitmap(posterRoot)

注意我的posterRoot是海报团矿内部的某个控件,如果有人使用的是LayoutInflater.from(context).inflate的view需要加

val metric = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(metric)
val width = metric.widthPixels     // 屏幕宽度(像素)
val height = metric.heightPixels   // 屏幕高度(像素)
val view = LayoutInflater.from(context).inflate。。。
layoutView(view, width, height)//针对inflate的view处理
private fun layoutView(view: View?, width: Int, height: Int) {
        // 整个View的大小 参数是左上角 和右下角的坐标
        view?.layout(0, 0, width, height)
        val measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY)
        val measuredHeight = View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.AT_MOST)
        /** 当然,measure完后,并不会实际改变View的尺寸,需要调用View.layout方法去进行布局。
         * 按示例调用layout函数后,View的大小将会变成你想要设置成的大小。
         */
        view?.measure(measuredWidth, measuredHeight)
        view?.layout(0, 0, view?.measuredWidth, view?.measuredHeight)
    }

3.保存bitmap到本地相册

说明:保存bitmap到本地相册最好写成有boolean返回值的的方法,方便判断保存失败获成功可以给提示

代码

/**
     * 保存bitmap到相册中
     *
     * @param bm
     * @param fileName
     * @param toastStr
     */
    public static Boolean savePicture(Bitmap bm, String fileName, String toastStr) {
        if (null == bm) {
            return false;
        }
        File foder = new File(Environment.getExternalStorageDirectory().getPath() + "/DCIM/happgo/");
        if (!foder.exists()) {
            foder.mkdirs();
        }
        File myCaptureFile = new File(foder, fileName);
        try {
            if (!myCaptureFile.exists()) {
                myCaptureFile.createNewFile();
            }
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
            //压缩保存到本地
            bm.compress(Bitmap.CompressFormat.JPEG, 90, bos);
            bos.flush();
            bos.close();
            //把图片保存后声明这个广播事件通知系统相册有新图片到来
            Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            Uri uri = Uri.fromFile(myCaptureFile);
            intent.setData(uri);
            BaseApplication.getInstance().sendBroadcast(intent);
            ToastUtils.showCenter(BaseApplication.getInstance(), toastStr);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

4.注意

描述:此功能需要权限,但是在某些厂商手机权限被认为禁用会不再提示如oppo等,所以需要使用者在权限请求失败后给用户提示或强行去打开设置。我使用的是java和kotlin混合开发,kotlin占大多数

上一篇下一篇

猜你喜欢

热点阅读