将View转换为Bitmap的2种方式

方法1.buildDrawingCache (不推荐)

android.view.View#buildDrawingCache(boolean)

android.view.View#getDrawingCache(boolean)

这2个方法配合使用使用,可以将View转换为Bitmap

缺点

1. 效率差,从源码注释可知,这个方法的使用会影响View的渲染性能,尤其是开了硬件加速的情况下,仍然会强制软件绘制一次。

2. 虽然带缩放参数,但仍然是整体绘制,效率差,费内存

3. 当View过大时容易导致卡顿。

方法2.View.draw()推荐

利用View自身的draw方法,再结合Matrix将自己的整体或者局部绘制到以Bitmap为画板的Canvas上,代码如下

/**
 * 高效的获取View的裁剪区
 * @param view 需要处理的View
 * @param crop 裁剪区域
 * @param downscaleFactor 缩放参数
 * @return
 */
public static Bitmap getDownscaledBitmapForView(View view, Rect crop, float downscaleFactor) {
    
    

    View screenView = view;

    int width = (int) (crop.width() * downscaleFactor);
    int height = (int) (crop.height() * downscaleFactor);
    float dx = -crop.left * downscaleFactor;
    float dy = -crop.top * downscaleFactor;

    if (width * height <= 0) {
    
    
        return null;
    }
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);//准备图片
    Canvas canvas = new Canvas(bitmap);//将bitmap作为绘制画布
    Matrix matrix = new Matrix();
    matrix.preScale(downscaleFactor, downscaleFactor);
    matrix.postTranslate(dx, dy);
    canvas.setMatrix(matrix);//设置matrix
    screenView.draw(canvas);//讲View特定的区域绘制到这个canvas(bitmap)上去,
    return bitmap;//得到最新的画布
}

优势

1. 按需绘制,按需裁剪

2. 需要的内存空间更小

3. 不影响硬件加速,而且效率更高

猜你喜欢

转载自blog.csdn.net/wang382758656/article/details/127628087