关于动态生成一张图片
动态生成一张图片,有两种方法。一种方式是利用Canvas画图,这种方式的关键技术点是绝对定位和动态比例尺,用习惯了,写起来也不难。缺点嘛自然是不直观,改动也不方便。还一种方式是利用xml布局,最后将图片导出来。封装好工具类之后,使用起来则非常方便。写xml的时候呢,可以使用 px 单位来布局(为什么是 px?当宽高固定为图片本身大小时,只有它才能绝对定位),修改起来也比较方便。当然,如果不想使用px,也可以使用dp固定死根布局的宽高(宽高的比值一定要和图片一致),再让图片 fitXY,此时则可以使用 dp 布局。这样做的一个不好的地方就是,在某些分辨率的机型上,图片可能被拉伸或压缩。
Android中View转换为Bitmap及getDrawingCache=null的解决方法
好了,直接上工具类代码,利用一个 xml 布局文件生成出一张图片
public class LoadBitmapFromViewUtil {
/**
* 从res-raw目录下获取一张Bitmap图片
* @param context
* @param id
* @return
*/
public static @Nullable
Bitmap loadBitmapFromRawResource(@NonNull Context context, @RawRes int id) {
InputStream inputStream = null;
try {
inputStream = context.getResources().openRawResource(id);
Bitmap rawBitmap = BitmapFactory.decodeStream(inputStream);
return rawBitmap;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
}
}
return null;
}
/**
* 从 输入流中 获取一张Bitmap图片,图片创建完成后,关闭此输入流
* @param inputStream
* @return
*/
public static @Nullable
Bitmap loadBitmapAndCloseStream(InputStream inputStream) {
if (inputStream == null) {
return null;
}
try {
return BitmapFactory.decodeStream(inputStream);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
inputStream.close();
} catch (IOException e) {
}
}
}
/**
* 根据资源 Id,加载出一个 View。并且保留原始布局的 layout 属性
* 注意,使用 LayoutInflater 的 inflate 方法加载 xml 布局文件时,如果第二个参数(即 parent root)为null,则会丢失所有 layout 开头的属性(如 layout_width等)
*/
public static View loadView(Context context, int viewResId) {
if (context == null || viewResId <= 0) return null;
FrameLayout frameLayout = new FrameLayout(context);
View view = LayoutInflater.from(context).inflate(viewResId, frameLayout, false);
return view;
}
/**
* 从静态资源中,渲染并导出一张Bitmap图片
* @param context
* @param viewResId
* @return
*/
public static Bitmap loadBitmap(Context context, int viewResId) {
if (context == null || viewResId <= 0) return null;
return loadBitmap(loadView(context, viewResId));
}
/**
* 从一个动态 View 中,渲染并导出一张Bitmap图片
*/
public static Bitmap loadBitmap(View view) {
if (view == null) return null;
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
}
参考网址
Android中View转换为Bitmap及getDrawingCache=null的解决方法