软件编程
位置:首页>> 软件编程>> Android编程>> Android 将view 转换为Bitmap出现空指针问题解决办法

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com