Android TV: VerticalGridFragment阴影的尺寸和颜色

5
我正在开发一款Android TV应用,但是我并不满意VerticalGridFragment渲染的标准阴影效果,我希望它更小一点并且更浅一些。

我查看了代码但是没有找到任何完整的可行解决方案。在我的VerticalGridPresenter子类中,我唯一可以重写的方法是createShadowOverlayOptions,但我无法获得我想要的结果。

我唯一想到的解决办法是定义以下尺寸,以覆盖支持库中声明的尺寸:

<dimen name="lb_material_shadow_details_z">3dp</dimen>
<dimen name="lb_material_shadow_focused_z">4dp</dimen>
<dimen name="lb_material_shadow_normal_z">3dp</dimen>

但这只是一个hack而不是一个正确的解决方案。

这是标准的阴影:

Standard shadow

这是我当前使用的hack得到的结果:

enter image description here

可以看出来,它更小了,但我无法改变颜色。

是否有一种正确的方法来设置VerticalGridFragmentRowsFragment类的阴影颜色和尺寸?

我正在使用最新的Leanback版本:

compile 'com.android.support:leanback-v17:25.2.0'

我的minSdkVersion是17,因为使用了自定义的Android TV播放器,但是从21开始工作也没有问题。

1个回答

2
我之前曾向 Leanback 团队询问过这个问题,他们说自定义组件的推荐方法是通过覆盖样式和尺寸来实现。因此,这可能有助于缓解您的一些担忧。
然而,我们还必须自定义视图上的阴影。我们通过创建自己的视图和自己的视图呈现器(而不是使用它们的 ImageCardView)来实现这一点。通过这种方式,我们能够在呈现层级别上设置自己的阴影。
如果您查看 ListRowPresenter 的文档,其中写道:

ListRowPresenter 对每个子视图应用默认阴影。调用 setShadowEnabled(boolean) 可以禁用阴影。子类可以重写 isUsingDefaultShadow() 并返回 false,并用自己的阴影实现替换默认实现。

要了解更多关于他们如何处理阴影的信息,请查看 ListRowPresenter 的源代码,以及查看 ShadowHelperShadowHelperApi21 类,以了解他们如何实现向列表项添加阴影。我们实际上只是复制了这两个类,因为它们是包本地的。
您也可以在ListRowPresenter中覆盖ShadowOverlayHelper.Options createShadowOverlayOptions()方法,这样您就可以改变圆角半径以及聚焦和非聚焦状态的z轴。

感谢您的提示:我接受了它,因为它指向了我实现自定义阴影所需的正确类和逻辑(当然,我不能在这里获得完整的实现)。 - fasteque
如果我只想在选择任何卡片时显示阴影怎么办? - NehaK
我已经有一段时间没有做这个了,但是最后一行应该可以工作:“您还可以在ListRowPresenter中覆盖ShadowOverlayHelper.Options createShadowOverlayOptions(),这使您能够更改角半径以及聚焦和非聚焦z。” 您可以提供一个ShadowOverlayHelper.Options,其中指定dynamicShadowUnfocusedZ为0,然后只显示聚焦阴影。 - Kyle Venn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接