每次想把View装换为Bitmap的时候都会调用函数getDrawingCache,但是一般返回的Bitmap都是ARGB8888的,解析了一下getDrawingCache的代码,是可以返回RGB565的Bitmap的,但是如何能够返回这样的图片不是很清楚,有达人能够给解释一下的么?

解决方案 »

  1.   

    View.buildDrawingCache为自己的view 建立相应的缓存,实际上就是一个Bitmap对象。
    Bitmap.Config.ARGB_8888;
    Bitmap.Config.ARGB_4444;
    Bitmap.Config.ARGB_8888;
    Bitmap.Config.ARGB_8888;
    Bitmap.Config.RGB_565;
    默认的格式是Bitmap.Config.ARGB_8888.,但大多数嵌入式设备使用的显示格式都是Bitmap.Config.RGB_565. 
    Bitmap.Config.RGB_565并没有alpha 值,所以绘制的时候不需要计算alpha合成,速递当让快些。其次,RGB_565可以直接使用优化了的memcopy函数,效率相对高出许多。
    在用buildDrawingCache建立缓存时, 可以使用RGB_565格式
    用 setDrawingCacheBackgroundColor(0xffff0000)设置为 非默认颜色后,建立的缓存就是rgb565了。
      

  2.   

    参考这个
    http://www.bangchui.org/read.php?tid=8458
    按上面的方法设置了setDrawingCacheBackgroundColor(0xffff0000)
    我试了下去layout的Cache返回的格式是565的了但背景成红色了。
      

  3.   

     
      public void buildDrawingCache(boolean autoScale) {
            if ((mPrivateFlags & DRAWING_CACHE_VALID) == 0 || (autoScale ?
                    (mDrawingCache == null || mDrawingCache.get() == null) :
                    (mUnscaledDrawingCache == null || mUnscaledDrawingCache.get() == null))) {            if (ViewDebug.TRACE_HIERARCHY) {
                    ViewDebug.trace(this, ViewDebug.HierarchyTraceType.BUILD_CACHE);
                }
                if (Config.DEBUG && ViewDebug.profileDrawing) {
                    EventLog.writeEvent(60002, hashCode());
                }            int width = mRight - mLeft;
                int height = mBottom - mTop;            final AttachInfo attachInfo = mAttachInfo;
                final boolean scalingRequired = attachInfo != null && attachInfo.mScalingRequired;            if (autoScale && scalingRequired) {
                    width = (int) ((width * attachInfo.mApplicationScale) + 0.5f);
                    height = (int) ((height * attachInfo.mApplicationScale) + 0.5f);
                }            final int drawingCacheBackgroundColor = mDrawingCacheBackgroundColor;
                final boolean opaque = drawingCacheBackgroundColor != 0 || isOpaque();
                final boolean use32BitCache = attachInfo != null && attachInfo.mUse32BitDrawingCache;            if (width <= 0 || height <= 0 ||
                         // Projected bitmap size in bytes
                        (width * height * (opaque && !use32BitCache ? 2 : 4) >
                                ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {
                    destroyDrawingCache();
                    return;
                }            boolean clear = true;
                Bitmap bitmap = autoScale ? (mDrawingCache == null ? null : mDrawingCache.get()) :
                        (mUnscaledDrawingCache == null ? null : mUnscaledDrawingCache.get());            if (bitmap == null || bitmap.getWidth() != width || bitmap.getHeight() != height) {
                    Bitmap.Config quality;
                    if (!opaque) {
                        switch (mViewFlags & DRAWING_CACHE_QUALITY_MASK) {
                            case DRAWING_CACHE_QUALITY_AUTO:
                                quality = Bitmap.Config.ARGB_8888;
                                break;
                            case DRAWING_CACHE_QUALITY_LOW:
                                quality = Bitmap.Config.ARGB_4444;
                                break;
                            case DRAWING_CACHE_QUALITY_HIGH:
                                quality = Bitmap.Config.ARGB_8888;
                                break;
                            default:
                                quality = Bitmap.Config.ARGB_8888;
                                break;
                        }
                    } else {
                        // Optimization for translucent windows
                        // If the window is translucent, use a 32 bits bitmap to benefit from memcpy()
                        quality = use32BitCache ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
                    }                // Try to cleanup memory
                    if (bitmap != null) bitmap.recycle();                try {
                        bitmap = Bitmap.createBitmap(width, height, quality);
                        bitmap.setDensity(getResources().getDisplayMetrics().densityDpi);
                        if (autoScale) {
                            mDrawingCache = new SoftReference<Bitmap>(bitmap);
                        } else {
                            mUnscaledDrawingCache = new SoftReference<Bitmap>(bitmap);
                        }
                        if (opaque && use32BitCache) bitmap.setHasAlpha(false);
                    } catch (OutOfMemoryError e) {
                        // If there is not enough memory to create the bitmap cache, just
                        // ignore the issue as bitmap caches are not required to draw the
                        // view hierarchy
                        if (autoScale) {
                            mDrawingCache = null;
                        } else {
                            mUnscaledDrawingCache = null;
                        }
                        return;
                    }                clear = drawingCacheBackgroundColor != 0;
                }            Canvas canvas;
                if (attachInfo != null) {
                    canvas = attachInfo.mCanvas;
                    if (canvas == null) {
                        canvas = new Canvas();
                    }
                    canvas.setBitmap(bitmap);
                    // Temporarily clobber the cached Canvas in case one of our children
                    // is also using a drawing cache. Without this, the children would
                    // steal the canvas by attaching their own bitmap to it and bad, bad
                    // thing would happen (invisible views, corrupted drawings, etc.)
                    attachInfo.mCanvas = null;
                } else {
                    // This case should hopefully never or seldom happen
                    canvas = new Canvas(bitmap);
                }            if (clear) {
                    bitmap.eraseColor(drawingCacheBackgroundColor);
                }            computeScroll();
                final int restoreCount = canvas.save();
                
                if (autoScale && scalingRequired) {
                    final float scale = attachInfo.mApplicationScale;
                    canvas.scale(scale, scale);
                }
                
                canvas.translate(-mScrollX, -mScrollY);            mPrivateFlags |= DRAWN;
                mPrivateFlags |= DRAWING_CACHE_VALID;            // Fast path for layouts with no backgrounds
                if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) {
                    if (ViewDebug.TRACE_HIERARCHY) {
                        ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW);
                    }
                    mPrivateFlags &= ~DIRTY_MASK;
                    dispatchDraw(canvas);
                } else {
                    draw(canvas);
                }            canvas.restoreToCount(restoreCount);            if (attachInfo != null) {
                    // Restore the cached Canvas for our siblings
                    attachInfo.mCanvas = canvas;
                }
            }
        }
      

  4.   


      final boolean opaque = drawingCacheBackgroundColor != 0 || isOpaque();
    实现565格式,
    1)只要drawingCacheBackgroundColor非零
       setDrawingCacheBackgroundColor(1);
       setDrawingCacheEnabled(true)     ;也可以实现565格式。
    2)isOpaque();
       setBackgroundColor(0xFF000000)   ;
       setDrawingCacheEnabled(true)     ;也可以实现565格式