You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何从已缩放的自定义View中获取完整的Bitmap?

问题根因

你之前修改的getBitmap方法错误地将Bitmap宽高乘以了scaleFactor:当你缩小视图时scaleFactor < 1,生成的Bitmap尺寸比View本身更小,缩放后坐标超出Bitmap尺寸的内容会被直接裁剪,所以只能看到初始可视范围内的第一个矩形。


两种场景解决方案

场景1:导出和当前屏幕上MyView显示效果完全一致的Bitmap

如果需要导出的内容和你在屏幕上看到的View显示效果完全相同,直接使用View本身的宽高创建Bitmap即可:

public Bitmap getBitmap(){
    // 直接用View的实际宽高创建Bitmap,和屏幕显示的画布尺寸一致
    Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    // 调用draw会自动走onDraw逻辑,应用当前的scaleFactor缩放,和屏幕显示完全一致
    draw(canvas);
    return bitmap;
}

修改后你缩小视图到三个矩形都在屏幕可见时,导出的Bitmap也会完整包含三个矩形。


场景2:不受当前View显示范围限制,导出完整的缩放后全部路径内容

如果需要无论View当前显示多大,都把所有绘制的路径内容完整导出,需要先计算路径的总边界,再适配缩放因子生成Bitmap:

public Bitmap getFullPathBitmap(){
    // 1. 计算所有路径的原始边界
    RectF pathBounds = new RectF();
    path.computeBounds(pathBounds, true);
    // 2. 根据缩放因子计算Bitmap尺寸,加20px边距避免内容贴边被裁剪
    int bitmapWidth = Math.round(pathBounds.width() * scaleFactor) + 20;
    int bitmapHeight = Math.round(pathBounds.height() * scaleFactor) + 20;
    // 3. 创建Bitmap和对应画布
    Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    // 4. 偏移画布避免内容被左上角裁剪,再应用当前缩放因子
    canvas.translate(10, 10);
    canvas.scale(scaleFactor, scaleFactor);
    // 5. 直接绘制路径即可得到完整内容
    canvas.drawPath(path, paint);
    return bitmap;
}

内容的提问来源于stack exchange,提问作者Abdo21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:09:03