解析Android中View转换为Bitmap及getDrawingCache=null的解决方法

 更新时间:2016年11月18日 15:03:23   作者:Devin Zhang  
在android中经常会遇到View转换为Bitmap的情形,本篇文章主要介绍了Android中View转换为Bitmap及getDrawingCache=null的解决方法,有需要的可以了解一下。

1.前言

Android中经常会遇到把View转换为Bitmap的情形,比如,对整个屏幕视图进行截屏并生成图片;Coverflow中需要把一页一页的view转换为Bitmap、以便实现复杂的图形效果(阴影、倒影效果等);再比如一些动态的实时View为便于观察和记录数据、需要临时生成静态的Bitmap。

2.实现方法

1)下面是笔者经常用的一个转换方法

  public static Bitmap convertViewToBitmap(View view, int bitmapWidth, int bitmapHeight){
    Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
    view.draw(new Canvas(bitmap));
    
    return bitmap;
  }

或者用如下方法:

public static Bitmap convertViewToBitmap(View view){
    view.buildDrawingCache();
    Bitmap bitmap = view.getDrawingCache();
    return bitmap; 
}

一般情况下,这个方法能够正常的工作。但有时候,生成Bitmap会出现问题(Bitmap全黑色)。主要原因是drawingCache的值大于系统给定的值。我们可以看一下buildDrawingCache()方法中的一段代码:

if (width <= 0 || height <= 0 ||(width * height * (opaque && !translucentWindow ? 2 : 4) > ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {  
         destroyDrawingCache();  
         return;  
 } 

上面的代码中,width和height是所要cache的view绘制的宽度和高度,所以(width * height * (opaque && !translucentWindow ? 2 : 4) 计算的是当前所需要的cache大小。ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系统所提供的最大的DrawingCache的值。当所需要的drawingCache >系统所提供的最大DrawingCache值时,生成Bitmap就会出现问题,此时获取的Bitmap就为null。

 所以在只需要修改所需的cache值就可以解决问题了。于是我们引入第二种方法:

2)完美的解决方案

public static Bitmap convertViewToBitmap(View view){
     view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
    view.buildDrawingCache();
    Bitmap bitmap = view.getDrawingCache();

     return bitmap;
}

view 使用 "getMeasuredWidth()" and "getMeasuredHeight()"方法计算长宽。此时,Bitmap就能正确获取了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Flutter软键盘的原理浅析

    Flutter软键盘的原理浅析

    大家应该都知道目前Flutter官方是没有自定义键盘的解决方案,下面这篇文章主要给大家介绍了关于Flutter软键盘原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • 解析Android中实现滑动翻页之ViewFlipper的使用详解

    解析Android中实现滑动翻页之ViewFlipper的使用详解

    有一些场景,我们需要向用户展示一系列的页面。比如我们正在开发一个看漫画的应用,可能就需要向用户展示一张一张的漫画图片,用户使用手指滑动屏幕,可以在前一幅漫画和后一幅漫画之间切换。这个时候ViewFlipper就是一个很好的选择
    2013-05-05
  • Android ListView滚动到底后自动加载数据

    Android ListView滚动到底后自动加载数据

    这篇文章主要为大家详细介绍了Android之ListView滚动到底后自动加载数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android将应用调试log信息保存在SD卡的方法

    Android将应用调试log信息保存在SD卡的方法

    Android将应用调试log信息保存在SD卡的方法大家都知道吗,下面脚本之家小编给大家分享Android将应用调试log信息保存在SD卡的方法,感兴趣的朋友参考下
    2016-04-04
  • Android 自定义View手写签名并保存图片功能

    Android 自定义View手写签名并保存图片功能

    这篇文章主要介绍了Android 自定义View手写签名并保存图片功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2020-03-03
  • Android使用ScrollView实现滚动效果

    Android使用ScrollView实现滚动效果

    这篇文章主要为大家详细介绍了Android使用ScrollView实现滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 详解Android中解析XML的方法

    详解Android中解析XML的方法

    XML在各种开发中都广泛应用,Android也不例外。这篇文章主要介绍了详解Android中解析XML的方法,有需要的可以了解一下。
    2016-11-11
  • android实现字体闪烁动画的方法

    android实现字体闪烁动画的方法

    这篇文章主要介绍了android实现字体闪烁动画的方法,涉及Android中线程调用和Timer计时器的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Android Jetpack架构组件Lifecycle详解

    Android Jetpack架构组件Lifecycle详解

    这篇文章主要介绍了Android Jetpack架构组件Lifecycle详解,Lifecycle是Jetpack架构组件中用来感知生命周期的组件,使用Lifecycles可以帮助我们写出和生命周期相关更简洁更易维护的代码。对此感兴趣的小伙伴可以来学习一下
    2020-07-07
  • Kotlin LinearLayout与RelativeLayout布局使用详解

    Kotlin LinearLayout与RelativeLayout布局使用详解

    Kotlin 的基本特性就先写到这里,我们这个系列的定位是基础,也就是能用就好,够用就好,我们不会举太多的例子,但是这些都是最经常用到的特性。从这节开始就是Kotlin和android 进行结合,使用Kotlin进行安卓应用的开发了
    2022-12-12

最新评论