Android矢量Drawable中如何裁剪路径实现时钟指针镂空透明?
实现指针镂空的方案
要通过裁剪路径实现指针区域的镂空,核心思路是把蓝色圆形放在一个裁剪组里,让裁剪路径只显示「完整画布减去指针区域」的部分,这样圆形在指针覆盖的位置就会被裁掉,形成透明镂空效果。
裁剪路径实现的完整代码
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> <!-- 裁剪组:只保留圆形减去指针的区域 --> <group> <!-- 裁剪路径:同时包含完整画布和指针路径,用evenOdd规则排除重叠区 --> <clip-path android:pathData="M0,0h24v24h-24z M12,7.17V12L16.032,15.562" android:fillType="evenOdd"/> <!-- 蓝色圆形 --> <path android:pathData="M12,22.806C17.968,22.806 22.806,17.968 22.806,12C22.806,6.032 17.968,1.194 12,1.194C6.032,1.194 1.194,6.032 1.194,12C1.194,17.968 6.032,22.806 12,22.806Z" android:strokeWidth="1.5" android:fillColor="#003087" android:strokeColor="#003087" android:strokeLineCap="round"/> </group> </vector>
关键逻辑说明
- 裁剪路径的
pathData同时写了整个画布的矩形路径和原来的指针路径,再加上android:fillType="evenOdd"规则:根据矢量图的奇偶填充规则,两个路径重叠的区域(也就是指针覆盖圆形的部分)会被排除在显示区域外,自然就形成了镂空。 - 原来的白色指针路径可以直接删掉,因为现在圆形已经被裁出了指针形状的透明区,不需要额外绘制指针。
更简洁的替代方案(无需裁剪组)
除了裁剪路径,还可以直接把圆形和指针路径合并,用fillType="evenOdd"实现镂空,代码更短:
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:pathData="M12,22.806C17.968,22.806 22.806,17.968 22.806,12C22.806,6.032 17.968,1.194 12,1.194C6.032,1.194 1.194,6.032 1.194,12C1.194,17.968 6.032,22.806 12,22.806Z M12,7.17V12L16.032,15.562" android:strokeWidth="1.5" android:fillColor="#003087" android:strokeColor="#003087" android:strokeLineCap="round" android:fillType="evenOdd"/> </vector>
这个方法是把圆形和指针的路径合并成一个,通过evenOdd填充规则让重叠区镂空,效果和裁剪路径完全一致,代码更简洁。
内容的提问来源于stack exchange,提问作者Quinn
相关产品推荐
相关产品推荐

