如何在视图周围没有背景的情况下(但不是在下面)正确绘制阴影?

时间:2015-11-14 08:34:42

标签: android android-view

我有RecyclerView来托管项目

每个都有一个StateListAnimator,当用户触摸它时会增加translationZ。基本上将提升到满足用户手指。

现在这一切都很好看,但是如果项目没有背景,你可以在下面看到阴影,这并不好看。

我可以通过将项目的背景设置为白色来解决这个问题,但它会出现令人讨厌的透支(窗口背景也是白色的,我需要它是白色的)。 有没有办法让阴影基本上只是在视图之外绘制,而不是在它下面?

我正在使用

setOutlineProvider(ViewOutlineProvider.BOUNDS);

即使没有背景设置,也会使影子尊重它的界限。

2 个答案:

答案 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)

我刚遇到同样的问题: enter image description here

我无法相信我没有立即想到这一点,但解决方案只是在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)