You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建内部路径透明的Android Vector Drawable收藏图标?

解决Vector Drawable内部路径透明的问题

我明白你遇到的困扰了——把内部路径设为透明后,下面的橙色路径直接透了出来,导致整个图标看起来全是橙色。这是因为Vector Drawable的路径是叠加绘制的:透明路径只是不填充自身,但不会“挖掉”下方路径的区域。要实现内部镂空的效果,得用路径填充规则或路径合并的方式处理,而不是简单设置透明色。

方法一:使用evenOdd填充规则(推荐)

这是最直接的方案,把内外两个心形路径合并成一个,通过android:fillType="evenOdd"让内部区域自动镂空。这个规则的逻辑是:路径交叉次数为奇数的区域会被填充,偶数次的区域则保持透明,刚好适合这种“外框填充、内部镂空”的形状。

修改后的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="72dp" 
    android:height="66dp" 
    android:viewportHeight="66" 
    android:viewportWidth="72">
    <!-- 合并内外心形路径,用evenOdd规则实现内部镂空 -->
    <path 
        android:fillColor="#F7592B" 
        android:fillType="evenOdd"
        android:pathData="M 20.99 1.04 C 26.30 1.45 30.97 4.88 36.04 5.70 C 40.02 5.23 43.79 2.79 47.70 1.80 C 56.08 -0.90 65.46 4.21 69.03 11.97 C 71.67 17.65 71.59 24.74 70.62 30.81 C 68.57 41.48 60.32 50.55 51.81 56.81 C 47.69 59.73 43.11 62.72 38.21 64.12 C 34.80 65.13 31.23 63.34 28.24 61.86 C 19.69 57.27 11.77 50.76 6.25 42.72 C 0.82 34.78 -0.33 24.87 1.66 15.60 C 3.69 7.15 12.14 0.18 20.99 1.04 Z
                          M 19.98 7.14 C 25.68 7.39 30.87 12.07 36.10 12.99 C 41.30 12.15 46.97 7.14 52.84 7.35 C 58.72 7.85 63.41 12.52 64.67 18.17 C 65.71 23.40 65.21 29.32 63.25 34.30 C 59.83 42.88 52.20 49.81 44.38 54.43 C 40.52 56.53 36.81 58.58 32.37 56.70 C 24.56 53.51 17.02 47.75 12.20 40.77 C 7.31 33.87 5.58 24.79 7.64 16.59 C 9.15 11.09 14.21 6.98 19.98 7.14 Z" />
</vector>

方法二:使用clipPath裁剪(适合复杂场景)

如果你的图标结构更复杂,也可以用clipPath实现镂空。思路是先绘制外部橙色心形,再用内部心形作为裁剪区域,把中间部分“剪掉”。

代码示例:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="72dp" 
    android:height="66dp" 
    android:viewportHeight="66" 
    android:viewportWidth="72">

    <!-- 绘制外部橙色心形 -->
    <path 
        android:fillColor="#F7592B" 
        android:pathData="M 20.99 1.04 C 26.30 1.45 30.97 4.88 36.04 5.70 C 40.02 5.23 43.79 2.79 47.70 1.80 C 56.08 -0.90 65.46 4.21 69.03 11.97 C 71.67 17.65 71.59 24.74 70.62 30.81 C 68.57 41.48 60.32 50.55 51.81 56.81 C 47.69 59.73 43.11 62.72 38.21 64.12 C 34.80 65.13 31.23 63.34 28.24 61.86 C 19.69 57.27 11.77 50.76 6.25 42.72 C 0.82 34.78 -0.33 24.87 1.66 15.60 C 3.69 7.15 12.14 0.18 20.99 1.04 Z" />

    <!-- 用内部心形作为裁剪区域,覆盖掉中间的橙色 -->
    <group android:clipPath="M 19.98 7.14 C 25.68 7.39 30.87 12.07 36.10 12.99 C 41.30 12.15 46.97 7.14 52.84 7.35 C 58.72 7.85 63.41 12.52 64.67 18.17 C 65.71 23.40 65.21 29.32 63.25 34.30 C 59.83 42.88 52.20 49.81 44.38 54.43 C 40.52 56.53 36.81 58.58 32.37 56.70 C 24.56 53.51 17.02 47.75 12.20 40.77 C 7.31 33.87 5.58 24.79 7.64 16.59 C 9.15 11.09 14.21 6.98 19.98 7.14 Z">
        <path 
            android:fillColor="@android:color/transparent" 
            android:pathData="M 0 0 L 72 0 L 72 66 L 0 66 Z" />
    </group>
</vector>

为什么原来的方法不行?

你原来的代码里,三个路径是依次叠加绘制的:透明矩形→橙色心形→蓝色心形。当把蓝色心形设为透明时,它不会遮挡下方的橙色心形,所以橙色会直接透出来,看起来整个图标都是橙色。而用evenOdd或裁剪的方式,是真正把内部区域从橙色路径中“挖掉”,而非简单的透明覆盖。

内容的提问来源于stack exchange,提问作者Anu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:02:22