自定义 VIEW 截图 保存到图库 并分享

需求是先显示将要分享视图的缩略图,点击缩略图再显示大图,并且支持保存到本地图库效果如下

这里写图片描述

这里写图片描述

将视图生成bitmap的方法

 fun loadBitmapFromView(v: View): Bitmap {
            val w = v.measuredWidth
            val h = v.measuredHeight
            val bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)
            val c = Canvas(bmp)
            v.layout(0,0, w, h)
            v.draw(c)
             return bmp
        }

注意调用时机一定要view layout完成,否则无法生成的Bitmap。View.post可以保证调用在界面绘制完成之后调用,用法如下

 iv_share.post {
            bitmap = ImageSaver.loadBitmapFromView(sv_img_activity_share_detail)
            //Glide 加载生成的图片
            ImageLoader.load(iv_image_share_detail,bitmap)
        }

将bitmap 保存成图片

 fun saveImage(bitmap: Bitmap, saveFile: File) {
            val fos = FileOutputStream(saveFile)
            bitmap.compress(android.graphics.Bitmap.CompressFormat.JPEG
                    , 100, fos)
            fos.flush()
            fos.close()
        }

targetSdk > 22 需要处理权限问题,比我如我要将生成的图片保存到图库

private fun saveImages() {
        try {
            val file = File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES),
                    System.currentTimeMillis().toString() + ".png")
            //调用保存方法
            ImageSaver.saveImage(bitmap, file)
            Toaster.show(R.string.save_success)
            //保存成功发送广播通知图库更新,没有这条必须手机重启才能看到新图片
            sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE
                    , Uri.fromFile(file)))
        } catch (e: Exception) {
            Toaster.show(R.string.save_failed)
        }

    }

这里第一张预览图的做法是,放置一个铺满全屏的,将要生成截图的View,设置其属性为
android:visibility="invisible"
等待截图完毕后设置其属性为
android:visibility="gone"
最后将生成的bitmap设置到ImageView上。这样能保证缩略图中的文字不变形。

发布了53 篇原创文章 · 获赞 17 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq910689331/article/details/82455651
今日推荐