保存海报到本地步骤
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;
}
}
网友评论