美文网首页
关于安卓保存海报实现

关于安卓保存海报实现

作者: 有爱的梦_大东 | 来源:发表于2020-03-11 15:19 被阅读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占大多数

    相关文章

      网友评论

          本文标题:关于安卓保存海报实现

          本文链接:https://www.haomeiwen.com/subject/zqnujhtx.html