android 创建空bitmap,Android 将view 转换为Bitmap出现空指针问题解决办法

在Android开发中,将View转换为Bitmap时,如果布局包含RelativeLayout且API低于17,可能会引发空指针异常。解决方法包括避免使用RelativeLayout或使用View.MeasureSpec.makeMeasureSpec(256, View.MeasureSpec.EXACTLY)。本文分享了这一问题的解决办法和相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:

*

*

{@link android.view.View.MeasureSpec#UNSPECIFIED}

*

{@link android.view.View.MeasureSpec#EXACTLY}

*

{@link android.view.View.MeasureSpec#AT_MOST}

*

*

*

Note: 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.

*

* @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) 好像也可以

以上就是Android 将view 转换为Bitmap出现空指针问题解决办法,如有疑问请留言或者到本站社区交流讨论,谢谢大家对本站的支持!

package com.example.myapplication; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.widget.Button; import android.widget.ImageView; import java.io.IOException; public class MainActivity extends Activity { // 将 imageView 声明为成员变量(作用域提升至整个类) private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化成员变量(确保 XML 中 ImageView 的 ID 是 android:id="@+id/image") imageView = findViewById(R.id.image); Button button = findViewById(R.id.btn); button.setOnClickListener(v -> openGallery()); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == RESULT_OK && data != null && data.getData() != null) { Uri selectedImageUri = data.getData(); try { Bitmap bitmap = MediaStore.Images.Media.getBitmap( this.getContentResolver(), selectedImageUri); // 此处可正确访问成员变量 imageView imageView.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } } public void openGallery() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 1); } } 有点复杂有简单一点的写法吗
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值