我有一个带有自定义背景的项目列表。背景是一个简单的形状,圆形 - 正方形可填充白色。所以我的观点类似于卡片。我可以设置它的高程,它的工作原理。它下面有一个阴影。
但我想优化它。我的窗口的背景是白色的,所以我认为我可以删除View的背景颜色以减少透支。但事情并非那么简单。只要我在视图的背景可绘制中将颜色设置为透明,高程就会停止工作并且不再绘制阴影。我试图在我的视图的bakcground drawable中使用笔触而不是纯色,但它也不起作用。这可能是因为ViewOutline
。所以我创建了一个返回如下内容的自定义OutlineProvider
:
outline.drawRoundRect(0,0,view.getWidth(), view.getHeight(), someRadius);
现在我的View
具有透明背景,阴影也可见但是它有问题。它看起来不太好。在View
的顶部,在它下方可以看到某种背景。下面是我输出的图片。左侧是具有透明背景和自定义OutlineProvider的视图。右边是一个不透明的白色背景视图。
这是一个错误吗?或者有另一种方法来实现这一目标吗?看起来这是一个非常简单的性能优化,但事实证明它比它应该复杂得多。
答案 0 :(得分:8)
我认为这与Lollipop https://code.google.com/p/android/issues/detail?id=78248
中的已知问题有关感谢报告和重复步骤 - 这确实是一个错误,而且它 刚刚被修复了一个内部分支。将在外部发布 在将来的版本中。
作为一种解决方法,您可以在GradientDrawable上设置alpha, 或者在投射阴影的视图上设置自定义轮廓提供者(通过 查看#setOutlineProvider)从背景中查询轮廓 覆盖drawable提供的alpha。
问题在于GradientDrawable过于保守 在具有透明填充的情况下报告0 alpha。 (看到 GradientDrawable#getOutline(),好奇的)