Android 将view 转换为Bitmap出现空指针问题解决办法
作者:lqh 发布时间:2022-02-12 02:17:23
标签:Android,view,Bitmap,空指针
Android 将view 转换为Bitmap出现空指针问题解决办法
在做Android 项目的时候,有时候可能有这样的需求,将一个View 或者一个布局文件转换成一个Bitmap 对象。
方法其实大都差不多。但这其中有一些小细节需要注意一下。最近在项目中用到了这个功能,现在分享一下,希望能帮助到遇到果这个
问题的人。
首先是转换 的代码:
/**
* 将View(布局) 转换为bitmap
* @param view
* @return
*/
public static Bitmap createBitmap(View view){
view.setDrawingCacheEnabled(true);
/**
* 这里要注意,在用View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
* 来测量view 的时候,(如果你的布局中包含有 RelativeLayout )API 为17 或者 低于17 会包空指针异常
* 解决方法:
* 1 布局中不要包含RelativeLayout
* 2 用 View.MeasureSpec.makeMeasureSpec(256, View.MeasureSpec.EXACTLY) 好像也可以
*
*/
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;
}
上面就是转换成Bitmap 的方法,但是要注意,在用View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
来测量view 的时候,(如果你的布局中包含有 RelativeLayout )API 为17 或者 低于17 会包空指针异常。在项目中遇到这个问题
死活不知道是怎么回事,后来在看源码的时候才发现。以下是这个方法的官方解释:
/**
* Creates a measure specification based on the supplied size and mode.
*
* The mode must always be one of the following:
* <ul>
* <li>{@link android.view.View.MeasureSpec#UNSPECIFIED}</li>
* <li>{@link android.view.View.MeasureSpec#EXACTLY}</li>
* <li>{@link android.view.View.MeasureSpec#AT_MOST}</li>
* </ul>
*
* <p><strong>Note:</strong> On API level 17 and lower, makeMeasureSpec's
* implementation was such that the order of arguments did not matter
* and overflow in either value could impact the resulting MeasureSpec.
* {@link android.widget.RelativeLayout} was affected by this bug.
* Apps targeting API levels greater than 17 will get the fixed, more strict
* behavior.</p>
*
* @param size the size of the measure specification
* @param mode the mode of the measure specification
* @return the measure specification based on size and mode
*/
public static int makeMeasureSpec(int size, int mode) {
if (sUseBrokenMakeMeasureSpec) {
return size + mode;
} else {
return (size & ~MODE_MASK) | (mode & MODE_MASK);
}
}
在API 17 以上的系统中才修正了这个bug,这里有两个解决方法:
1 ,布局文件中不要包含Relativelayout 布局
2,用 View.MeasureSpec.makeMeasureSpec(256, View.MeasureSpec.EXACTLY) 好像也可以
来源:http://blog.csdn.net/zwluoyuxi/article/details/44259275


猜你喜欢
- 前文传送门:Netty分布式高性能工具类recycler的使用及创建从对象回收站中获取对象我们回顾上一小节demo的main方法中从回收站获
- 项目需求:根据年级下拉框的变化使得科目下拉框绑定次年级下对应有的值我们用三层架构的模式来实现1.我们想和数据库交互,我们首先得来先解决DAL
- 本文实例为大家分享了抢红包源码,供大家参考,具体内容如下1. 正确获取红包流程2. 软件介绍2.1 效果图:2.2 功能介绍2.2.1 账号
- 项目需求为APP的使用单位有很多部门,各个部分的业务也是独立的,所以开发的APP中如果把所有的模块都显示出来然后再做权限分配,会显得屏幕全是
- 前言:最近涉及到和QQ打交道,定义所有的好友一共只能有300条消息,如果一次性从数据库读取300条或者更多,界面会有细微的卡顿.所以考虑了下
- .net内存回收与Dispose﹐Close﹐Finalize方法一. net的对象使用一般分为三种情况﹕1.创建对象2.使用对象3.释放对
- java读取resources文件详解及实现代码Java项目中,经常需要将资源文件打包放在项目中,然后在项目中去读取对应的文件。实现代码:S
- 本文实例讲述了Java正则验证正整数的方法。分享给大家供大家参考,具体如下:package des;import java.util.reg
- 前言在我们做后端服务Dao层开发,特别是大数据批量插入的时候,这时候普通的ORM框架(Mybatis、hibernate、JPA)就无法满足
- 1、项目启动时报错如下Description:The bean 'securityManager', defined in
- 1. 概述官方JavaDocsApi: javax.swing.JProgressBar JProgressBar,进度条。以可视化形式显示
- 一、为什么需要服务网关:1、什么是服务网关:
- 本文先为大家介绍如何利用缓存Cache方便地实现此功能。 Cache与Session这二个状态对像的其中有一个不同之处,Cache是一个全局
- 前言继上次文章C# 初识Picture控件,今天我们来学一下PictureBox的方法以及一些基本操作,对于图片的删除,上传以及重命名,之前
- 本文实例讲述了Hibernate批量处理海量数据的方法。分享给大家供大家参考,具体如下:Hibernate批量处理海量其实从性能上考虑,它是
- 之前一篇文章研究完横向二级菜单,发现其中使用了SparseArray去替换HashMap的使用.于是乎自己查了一些相关资料,自己同时对性能进
- 汇总:1. 冒泡排序每轮循环确定最值;public void bubbleSort(int[] nums){ in
- 引言RecyclerView是在Android5.0版本作为support-v7的一个组件出现,高效替代了最初的ListView等列表组件。
- 本文实例为大家分享了JavaMail实现带附件的邮件发送的具体代码,供大家参考,具体内容如下发送纯文本的邮件package com.haiw
- 前言本问主要介绍DataBinding在Android App中的使用方法。数据绑定是将“提供器”的数据源与“消费者”绑定并使其同步的一种通