我有RecyclerView
来托管项目。
每个项都有一个StateListAnimator
,当用户触摸它时会增加translationZ。基本上将项提升到满足用户手指。
现在这一切都很好看,但是如果项目没有背景,你可以在下面看到阴影,这并不好看。
我可以通过将项目的背景设置为白色来解决这个问题,但它会出现令人讨厌的透支(窗口背景也是白色的,我需要它是白色的)。 有没有办法让阴影基本上只是在视图之外绘制,而不是在它下面?
我正在使用
setOutlineProvider(ViewOutlineProvider.BOUNDS);
即使没有背景设置,也会使影子尊重它的界限。
答案 0 :(得分:0)
考虑到这是一个非常抽象的问题,我不能 提供我的意思的任何图像,我仍然想让你知道 我解决了这个问题,我认为这是解决问题的一种有趣方式。我希望 那里的其他人会使用这个。
因此,View
会投射阴影,如果视图没有背景,则会在视图下方看到阴影。
但如果已经有背景(例如在窗口本身或容器视图上),在视图上设置背景可能会引入性能问题。
因此,为了解决此问题,您可以使用动画可绘制选择器,使用StateListAnimator
淡入/淡出背景。
StateListAnimator :( raise )
<objectAnimator
android:duration="@android:integer/config_shortAnimTime"
android:propertyName="translationZ"
android:valueTo="@dimen/touch_raise"/>
</item>
<item>
<objectAnimator
android:duration="@android:integer/config_shortAnimTime"
android:propertyName="translationZ"
android:valueTo="0dp"/>
</item>
选择器 :( selector_to_white )
<item
android:state_enabled="true"
android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@android:color/white"/>
</shape>
</item>
布局:
<View
//View width, etc
android:stateListAnimator="@animator/raise"
android:background="@drawable/selector_to_white"
android:outlineProvider="bounds"/>
瞧,瞧,你有它。即使视图没有背景,也会在其自身下方投射阴影的视图不可见。适合我的情况,希望对你有用。
答案 1 :(得分:0)
我无法相信我没有立即想到这一点,但解决方案只是在Color.alpha(background) != 255
之外绘制一个不透明的背景以及所需的背景。所以像这样:
val backgroundColor = background.color
if (Color.alpha(backgroundColor) != 255) {
background.color = backgroundColors.defaultColor
drawBackground(canvas, width, height)
background.color = backgroundColor
}
drawBackground(canvas, width, height)