View.getDrawingCache()取Bitmap时透明PNG区域显示黑色,可否修改为白色?
问题原因
透明区域显示黑色是因为View生成Bitmap时未处理透明通道:默认生成的Bitmap无底色填充,透明区域会被系统默认填充为黑色。
解决方案
方案1:临时修改布局背景(改动原有View属性)
先给目标布局临时设置白色背景,截图完成后恢复原有背景即可,代码修改如下:
private void takescreenshot(LinearLayout preview) throws IOException { // 保存原有背景 Drawable originalBg = preview.getBackground(); // 临时设置白色背景 preview.setBackgroundColor(Color.WHITE); View z = preview; z.setDrawingCacheEnabled(true); // 确保布局绘制完成 z.measure(View.MeasureSpec.makeMeasureSpec(z.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(z.getHeight(), View.MeasureSpec.EXACTLY)); z.layout(0, 0, z.getMeasuredWidth(), z.getMeasuredHeight()); z.buildDrawingCache(true); Bitmap bitmap = Bitmap.createBitmap(z.getDrawingCache()); z.destroyDrawingCache(); // 恢复原有背景 preview.setBackground(originalBg); }
方案2:Canvas手动绘制(推荐,不改动原有View)
直接创建带透明通道的Bitmap,用Canvas先填充底色再绘制View内容,适配性更高,高版本安卓也可正常使用:
private void takescreenshot(LinearLayout preview) throws IOException { // 创建和View尺寸一致、支持透明通道的Bitmap Bitmap bitmap = Bitmap.createBitmap(preview.getWidth(), preview.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); // 填充白色底色,不需要白色要保留透明的话删除这行即可 canvas.drawColor(Color.WHITE); // 把View内容绘制到画布 preview.draw(canvas); }
如果调用截图方法时View还未完成渲染(如Activity刚启动时调用),需要在绘制前手动测量布局:
preview.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); preview.layout(0, 0, preview.getMeasuredWidth(), preview.getMeasuredHeight());
内容的提问来源于stack exchange,提问作者Abdullah Saeed
相关产品推荐
相关产品推荐

