情况如:http://www.oschina.net/question/6530_44340

模拟器上面getDrawingCache可以返回值,而在真机上面返回null

当我们需要获取某个View的DrawingCache时回去调用getDrawingCache方法,有同学说可以使用getDrawable;但这两个是不一样的,根本上的不一样暂时还没去研究,至少getDrawable获取的是原图(至少大小是跟原图一样大),而getDrawingCache返回的Image是ImageView控件显示的一个截屏

那么当getDrawingCache返回null时我们怎么解决

http://stackoverflow.com/questions/2339429/android-view-getdrawingcache-returns-null-only-null,这篇blog说添加如下代码:

// this is the important code :)

// Without it the view will have a dimension of 0,0 and the bitmap will be null

v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

后面我发现,如果是你的DrawingCache超过最大Cache,这招管用,如果不是,这招不管用。

现在网上很多遇到的getDrawingCache返回为null都是DrawingCache大小超过Cache大小导致的,但我这里不是这个问题导致。

我看了下View源码,getDrawingCache是这样实现的:

public Bitmap getDrawingCache() {

return getDrawingCache(false);

}

我们接着看getDrawingCache(false):

public Bitmap getDrawingCache(boolean autoScale) {

if ((mViewFlags & WILL_NOT_CACHE_DRAWING) == WILL_NOT_CACHE_DRAWING) {

return null;

}

if ((mViewFlags & DRAWING_CACHE_ENABLED) == DRAWING_CACHE_ENABLED) {

buildDrawingCache(autoScale);

}

return autoScale ? (mDrawingCache == null ? null : mDrawingCache.get()) :

(mUnscaledDrawingCache == null ? null : mUnscaledDrawingCache.get());

}

如果getDrawingCache返回null,大体两种可能

1) (mViewFlags & WILL_NOT_CACHE_DRAWING) == WILL_NOT_CACHE_DRAWING 这个值为true

2) (mViewFlags & DRAWING_CACHE_ENABLED) == DRAWING_CACHE_ENABLED 为false,buildDrawingCache没执行

3) buildDrawingCache执行失败

我们怎么去粗略的估计是那种原因导致的呢

后面我发现View的willNotCacheDrawing这个方法,代码如下

public boolean willNotCacheDrawing() {

return (mViewFlags & WILL_NOT_CACHE_DRAWING) == WILL_NOT_CACHE_DRAWING;

}

他返回的就是刚才的第一种情况的那个boolean值,我们可以直接debug查看是否为true,如果该值为true,可以强行转成false,View.setWillNotCacheDrawing( Boolean.FALSE).

第二种情况可以看View的 isDrawingCacheEnabled方法

public boolean isDrawingCacheEnabled() {

return (mViewFlags & DRAWING_CACHE_ENABLED) == DRAWING_CACHE_ENABLED;

}

如果这个方法为false,那就是之前忘记调用setDrawingCacheEnabled(Boolean.TRUE)方法了。

至于第三种,zartzwj『http://www.iteye.com/topic/1098839』同学有分析,

在buildDrawingCache(boolean)方法中有这样一段代码

if (width <= 0 || height <= 0 ||

// Projected bitmap size in bytes

(width * height * (opaque && !translucentWindow ? 2 : 4) >

ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {

destroyDrawingCache();

return;

}

很多同学遇到的可能都是这种, (width * height * (opaque && !translucentWindow ? 2 : 4) 大于 ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()导致buildDrawingCache失败。

怎么判断是否这里导致的呢,如果你在前面没有对View的layout自行设置,是程序默认,并且调用的是view.getDrawingCache()或者是view.getDrawingCache(false);

view.getHidth的值就是这儿的width值

view.getHeight的值就是这儿的height

将这两个值乘以4如果还没大于ViewConfiguration.get(Context).getScaledMaximumDrawingCacheSize(),那么就不可能是是DrawingCache大于最大Cache所导致的,

如果乘以4大于了,也不一定就是,因为(width * height * (opaque && !translucentWindow ? 2 : 4)有这个变数。

我遇到的是第一种情况,willNotCacheDrawing我没有调用,使用的默认值,但为什么在模拟器上面为false,而在真机上就是true了呢?现在还不是很清楚

刚接触android不久,对API不是很熟,各位大牛轻拍

更多相关文章

  1. ContentProvider 学习之01
  2. 用cmd 命令更改Android(安卓)的默认虚拟机的地址的方法
  3. Android(安卓)开发艺术探索笔记 第四章 View的工作原理
  4. Android(安卓)studio把一段代码快速提取,放在自己定义方法里面的
  5. Retrofit2源码分析(2) CallAdapter详解
  6. Android(安卓)EditText 密码输入框可见性设置。
  7. Android(安卓)2.0新增类ExifInterface使用
  8. Android(安卓)学习路线
  9. Android待机状态更新

随机推荐

  1. 开源公司IronTec将推动PHP进驻Android平
  2. Android如何使布局中图(ImageButton)和文字
  3. Kotlin在AndroidStudio中的环境搭建以及
  4. 布局中文件中【控件间距参数详解以及单位
  5. 【博客园客户端】博客园Android客户端更
  6. android 系统服务
  7. Android(安卓)游戏开发的一些基础和经验
  8. Android模拟器
  9. Android自定义Transition动画
  10. 进入android项目组的第一天