需求是先显示将要分享视图的缩略图,点击缩略图再显示大图,并且支持保存到本地图库效果如下
将视图生成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上。这样能保证缩略图中的文字不变形。