【问题标题】:Elevation in a View with transparent background具有透明背景的视图中的高度
【发布时间】:2015-11-24 00:16:16
【问题描述】:

我有一个带有自定义背景的项目列表。背景是一个简单的形状,带有填充白色的圆角矩形可绘制对象。所以我的观点类似于卡片。我可以在上面设置一个高度,它可以工作。它下面有一个影子。

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

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

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

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

【问题讨论】:

  • 如果我应该问你需要一个替代方案或让你的工作?
  • 发布一些你得到的结果的图片:) 另外,除非你遇到性能问题,否则最好不要优化。如果不进行测量,很难猜测程序的哪些部分需要优化,可能还有其他更容易修复的较大瓶颈,并且这种更改可能需要同样多的功率或更多。
  • @Elltz 没关系。只想拥有一张透明背景和阴影的卡片。
  • @JohanShogun 减少过度绘制是一项重要的优化,尤其是当视图显示在列表中时。我附上了一张图片。
  • 你有证据证明这是一种优化吗?你有问题吗?请提供一些测量值

标签: android android-5.0-lollipop


【解决方案1】:

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

感谢您的报告和重现步骤 - 这确实是一个错误,而且 刚刚在内部分支中修复。将对外发布 在未来的版本中。

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

问题在于 GradientDrawable 在 在具有透明填充的情况下报告 0 alpha。 (看 GradientDrawable#getOutline(),对于好奇的人)

【讨论】:

  • 谢谢!我不知何故错过了这个问题。
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2012-05-26
  • 1970-01-01
  • 2020-10-29
  • 2015-01-20
相关资源
最近更新 更多