Android垂直虚线分隔符不显示、圆角设置无效如何解决
问题根源
<corners>标签仅对rectangle、oval这类闭合形状生效,你当前使用的android:shape="line"属于开放线段类型,本身不支持圆角配置,写了也不会产生任何效果。- 虚线不显示的核心原因有两个:一是
line类型的shape没有固有尺寸,你给ImageView宽度设为wrap_content时,系统计算不出正确的控件宽度,会把内容压缩到0导致线不可见;二是如果线的端点是圆角,没有留足够的内边距的话,圆角部分会被控件边界裁剪。 - 你要的圆角椭圆形虚线效果(即每个虚线段两端为圆弧,而非直角),不需要依赖
corners实现,直接配置描边的端点属性即可。
正确实现方案
1. 修改drawable文件
不需要嵌套多余的layer-list,直接通过旋转+line形状实现,给描边加strokeCap="round"属性就能得到圆角端点的虚线,dashed_separator.xml代码如下:
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="90" android:toDegrees="90"> <shape android:shape="line"> <stroke android:width="2dp" android:color="@color/grey" android:dashWidth="4dp" android:dashGap="4dp" android:strokeCap="round" /> <!-- 留内边距避免圆角端点被裁剪 --> <padding android:left="1dp" android:right="1dp" android:top="5dp" android:bottom="5dp" /> </shape> </rotate>
如果你需要水平虚线,直接去掉外层的
rotate标签即可。
2. 修改布局代码
不要用ImageView承载分隔线,直接用普通View即可,性能更好,同时给View指定明确的宽度(不要用wrap_content),保留软件层类型关闭硬件加速(硬件加速会导致虚线失效):
<View android:layout_width="2dp" android:layout_height="match_parent" android:background="@drawable/dashed_separator" android:layerType="software" />
补充说明
- 设置
android:strokeCap="round"后,每个虚线段的两端会生成半圆形的端点,整体看起来就是椭圆形的虚线段,完全符合圆角效果要求。 - 如果需要调整虚线段的间距、长度,直接修改
dashWidth和dashGap的值即可,注意圆角端点会额外占一点宽度,如果出现虚线段偏长的情况,可以适当把dashWidth调小0.5-1dp适配。 - 如果你要实现的是闭合的圆角矩形/椭圆形虚线边框,而不是单根分隔线,需要把shape类型改成
rectangle或者oval,设置透明填充,再给stroke配置虚线参数,这时候<corners>标签才会生效,参考写法如下:
<shape android:shape="rectangle"> <solid android:color="@android:color/transparent" /> <stroke android:width="2dp" android:color="@color/grey" android:dashWidth="4dp" android:dashGap="4dp" android:strokeCap="round" /> <corners android:radius="4dp" /> </shape>
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

