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
相关产品推荐
相关产品推荐

