Recycleview 滑动时shape背景残留细线解决方案

引言

相信开发中经常使用到shape实现一些简单的形状或背景,笔者在实践中就遇到这么一个问题:在列表中使用shape制定圆角矩形背景,滑动列表,发现当shape滑动到列表顶部边界处出现明显抖动,且滑过之后shape在顶部残留了一条等宽同颜色的细线。

请注意观察toolbar与recycleview交界处(为了大家能够观察到,我特地调了一些颜色,把shape宽度放大些,是不是感动得想要点赞一波)。

追踪

在google搜索无果情况下,依靠强烈的求知欲,一步步试探。

实际开发中item比较复杂,只有在shape背景这里等宽处才有此问题,我尝试使用图片的形式替代shape,异常消失了。这个操作至少说明是渲染shape的时候出现的异常。那么接下来就研究shape属性了。

以下是我一开始定义的shape文件:

<?xml version="1.0" encoding="UTF-8"?>

    <shape xmlns:android="http://schemas.android.com/apk/res/android">

    <corners android:radius="18dp"/>

    <stroke android:color="#3b55e7" android:width="4dp"/>

    <solid android:color="#ffffff"/>

</shape>

咋看之下没有问题,但目前毫无头绪,只能尽可能的尝试。于是乎,我把corners去除掉(或改成0dp),结果再一次发生奇迹了,滑动显示正常。

接着,我再把corners加上去,把stroke去除,并把solid改成其他显眼的颜色,也正常了,毫无异常。

分析

图片正常说明是shape渲染有问题,并且corners和stroke两个因素的效果对比也说明此问题。此外,仔细观察顶上的gif,发现细线宽度正好是去除shape圆角部分,故而也推测跟corners相关。那么问题根源是什么,笔者愚钝,请教数位大神后,得出可能性的猜测:系统渲染shape有异常。换句话说就是系统的问题,与代码配置无关。如果你觉得不是,请留下你的高见,大家一起探讨。

解决办法

想必有遇到此问题的,肯定直接越过上面直接看到这行了。那我不多说,直接上代码:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <corners android:radius="18dp"/>
            <solid android:color="#3b55e7"/>
        </shape>
    </item>

    <item android:top="1dp"
          android:left="1dp"
          android:right="1dp"
          android:bottom="1dp">
        <shape>
            <corners android:radius="18dp"/>
            <solid android:color="#ffffff"/>
        </shape>
    </item>
</layer-list>

就是使用layerlist替代,避免单独使用shape绘制圆角背景,使用solid叠加覆盖,而不是直接使用stoke。

感悟

问题虽小,但总要有人记录,有人提异议,有人反驳。谨言慎行,希望自己日后技术不断精进突破,233333333333~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值