已测量过的View生成Bitmap
即经过测量、布局、绘制并显示在界面上的View,此类View无需再次进行测量和布局,可直接将内容绘制到指定的Bitmap上。
/**
* 绘制已经测量过的View
*/
private static Bitmap drawMeasureView(View view) {
int width = view.getWidth();
int height = view.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
return bitmap;
}
未测量过的View生成Bitmap
直接Inflate后并未显示在界面的View,此类View必须手动进行测量和布局后,方可进行绘制,否则获取不到对应的宽高和内容。
/**
* 先测量和布局,再生成Bitmap
*/
public static Bitmap getBitmap(View view) {
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int screenWidth= metric.widthPixels; // 屏幕宽度(像素)
int screenHeight = metric.heightPixels; // 屏幕高度(像素)
// 测量
int widthSpec = View.MeasureSpec.makeMeasureSpec(screenWidth, View.MeasureSpec.AT_MOST);
int heightSpec = View.MeasureSpec.makeMeasureSpec(screenHeight, View.MeasureSpec.AT_MOST);
view.measure(widthSpec, heightSpec);
// 布局
int measuredWidth = view.getMeasuredWidth();
int measuredHeight = view.getMeasuredHeight();
view.layout(0, 0, measuredWidth, measuredHeight);
// 绘制
int width = view.getWidth();
int height = view.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
return bitmap;
}
更新、填充布局中view的内容显示
public void layoutView(final View viewBitmap, String url, Activity activity) {
final ImageView imageView = viewBitmap.findViewById(R.id.iv_show);
//注意加载网络图片时一定要用SimpleTarget回调
Glide.with(activity).asBitmap().load(url).into(new SimpleTarget() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition super Bitmap> transition) {
//图片加载完毕回调,可以在这里完成整个页面bitmap的转换
imageView.setImageBitmap(resource);
Bitmap bitmap = getBitmap(viewBitmap);
//保存到本地
savePhotoToSDCard(bitmap );
}
});
}
保存到本地(切记在清单文件里面增加sd卡的相关权限、动态申请等操作)
public static void savePhotoToSDCard(Bitmap photoBitmap) {
FileOutputStream fos;
String imagePath = "";
try {
// 判断手机设备是否有SD卡
boolean isHasSDCard = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
if (isHasSDCard) {
// SD卡根目录
File sdRoot = Environment.getExternalStorageDirectory();
File file = new File(sdRoot, Calendar.getInstance().getTimeInMillis()+".png");
fos = new FileOutputStream(file);
imagePath = file.getAbsolutePath();
} else{
throw new Exception("创建文件失败!");
}
cachebmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
其实里面的坑有好多,也是参考了好几篇文章,才解决了这个需求,谢谢以下的文章作者,同时也给大家一个参考。