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

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...