赞
踩
相信开发中经常使用到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~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。