在透视背景的视图中的海拔

我有一个自定义背景的项目列表。 背景是一个简单的形状,圆形正方形可绘制填充白色。 所以我的观点类似于卡片。 我可以设置它的高程,它的工作原理。 它下面有一个阴影。

但我想优化它。 我的窗口的背景是白色的,所以我认为我可以删除View的背景颜色以减少透支。 但事情并非那么简单。 只要我在视图的背景可绘制中将颜色设置为透明,高程就会停止工作并且不再绘制阴影。 我试图在我的视图的bakcground drawable中使用笔触而不是纯色,但它也不起作用。 这可能是因为ViewOutline 。 所以我创建了一个自定义的OutlineProvider ,返回如下内容:

 outline.drawRoundRect(0,0,view.getWidth(), view.getHeight(), someRadius); 

现在我的View具有透明背景,阴影也可见,但它有问题。 它看起来不太好。 在View的顶部,在它下面可以看到某种背景。 下面是我输出的图片。 左侧是具有透明背景和自定义OutlineProvider的视图。 在右边是一个不透明的白色背景视图。

在此处输入图像描述

这是一个错误吗? 或者还有另一种方法来实现这一目标吗? 看起来这是一个非常简单的性能优化,但事实certificate它比它应该复杂得多。

我认为这与Lollipop中的已知问题有关https://code.google.com/p/android/issues/detail?id=78248

感谢报告和重复步骤 – 这确实是一个错误,它刚刚在内部分支中修复。 将在未来的版本中发布。

作为解决方法,您可以在GradientDrawable上设置alpha,或者在投影阴影的视图上设置自定义轮廓提供程序(通过View#setOutlineProvider)从背景查询轮廓并覆盖drawable提供的alpha。

问题是GradientDrawable在报告0 alpha时过于保守,因为它有透明填充。 (参见GradientDrawable#getOutline(),好奇)