利用一个xml布局文件生成出一张图片以分享给好友

关于动态生成一张图片

动态生成一张图片,有两种方法。一种方式是利用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的解决方法

猜你喜欢

转载自blog.csdn.net/ybf326/article/details/83247246
今日推荐