DataPath实现渐变效果

Android的vector矢量图很好用,可以画出保证清晰度的任意图形。但是Android Nougat之前的VectorDrawable不支持渐变色,如果要使用渐变色就要使用png图片或者自定义GradientDrawable。这么明显的不足,肯定是要修补上呀,API 24中的VectorDrawable可以支持了gradient了。

下面是我用vector画的渐变图形,linear、radical、sweep三种形式的渐变都画了。使用vector画渐变,总体就是设置渐变类型、渐变开始和结束颜色、渐变位置坐标即可。其中线性渐变要设置startX,startY坐标、endX,endY坐标,并且根据这两个坐标就可以确定渐变方向;放射性渐变需要设置centerX和centerY坐标以及渐变半径;扫描性渐变只需要设置centerX和centerY坐标即可。如果需要多种颜色渐变,则添加item,设置颜色和偏移量(从0到1)即可。

代码如下:

复制代码
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="28"
    android:viewportHeight="28">

<!-- linear 线性渐变    -->
    <path android:pathData="M0,0h6v6h-6z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endColor="#ff0000"
                android:endX="0"
                android:endY="0"
                android:startColor="#00ff00"
                android:startX="6"
                android:startY="6"
                android:type="linear" />
        </aapt:attr>
    </path>

    <path android:pathData="M0,7h6v6h-6z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endColor="#ff0000"
                android:endX="0"
                android:endY="7"
                android:startColor="#00ff00"
                android:startX="0"
                android:startY="13"
                android:type="linear" />
        </aapt:attr>
    </path>

    <path android:pathData="M0,14h6v6h-6z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endColor="#ff0000"
                android:endX="6"
                android:endY="14"
                android:startColor="#00ff00"
                android:startX="0"
                android:startY="14"
                android:type="linear" />
        </aapt:attr>
    </path>


    <path android:pathData="M0,21h6v6h-6z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endColor="#ff0000"
                android:endX="0"
                android:endY="27"
                android:startColor="#00ff00"
                android:startX="0"
                android:startY="21"
                android:type="linear" >

                <item
                    android:color="#00ff00"
                    android:offset="0.0" />
                <item
                    android:color="#0000ff"
                    android:offset="0.5" />
                <item
                    android:color="#ff0000"
                    android:offset="0.5" />
                <item
                    android:color="#ffff00"
                    android:offset="1.0" />
            </gradient>
        </aapt:attr>
    </path>


    <!-- radial 放射性渐变    -->
    <path android:pathData="M7,5a1,1 0 0 1 10,0a1,1 0 0 1 -10,0">
        <aapt:attr name="android:fillColor">
            <gradient
                android:centerX="12"
                android:centerY="5"
                android:endColor="#ff0000"
                android:gradientRadius="5"
                android:startColor="#00ff00"
                android:type="radial" />
        </aapt:attr>
    </path>

    <path android:pathData="M18,5a1,1 0 0 1 10,0a1,1 0 0 1 -10,0">
        <aapt:attr name="android:fillColor">
            <gradient
                android:centerX="23"
                android:centerY="5"
                android:endColor="#ff0000"
                android:gradientRadius="5"
                android:startColor="#00ff00"
                android:type="radial" >

                <item
                    android:color="#00ff00"
                    android:offset="0.0" />
                <item
                    android:color="#ff0000"
                    android:offset="0.2" />
                <item
                    android:color="#ffff00"
                    android:offset="0.4" />
            </gradient>
        </aapt:attr>
    </path>


    <!-- sweep 扫描性渐变    -->
    <path android:pathData="M7,16a1,1 0 0 1 10,0a1,1 0 0 1 -10,0">
        <aapt:attr name="android:fillColor">
            <gradient
                android:centerX="12"
                android:centerY="16"
                android:endColor="#ff0000"
                android:startColor="#00ff00"
                android:type="sweep" />
        </aapt:attr>
    </path>
    <path android:pathData="M18,16a1,1 0 0 1 10,0a1,1 0 0 1 -10,0">
        <aapt:attr name="android:fillColor">
            <gradient
                android:centerX="23"
                android:centerY="16"
                android:endColor="#ff0000"
                android:startColor="#00ff00"
                android:type="sweep" >
                <item
                    android:color="#00ff00"
                    android:offset="0.0" />
                <item
                    android:color="#ff0000"
                    android:offset="0.2" />
                <item
                    android:color="#ffff00"
                    android:offset="0.4" />
            </gradient>
        </aapt:attr>
    </path>


    <path android:pathData="M9,22h6v6h-6z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:centerX="12"
                android:centerY="25"
                android:endColor="#ff0000"
                android:startColor="#00ff00"
                android:type="sweep" />
        </aapt:attr>
    </path>
    <path android:pathData="M20,22h6v6h-6z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:centerX="23"
                android:centerY="25"
                android:endColor="#ff0000"
                android:startColor="#00ff00"
                android:type="sweep" >
                <item
                    android:color="#00ff00"
                    android:offset="0.0" />
                <item
                    android:color="#ff0000"
                    android:offset="0.4" />
                <item
                    android:color="#ffff00"
                    android:offset="0.4" />
                <item
                    android:color="#00ffff"
                    android:offset="1" />
            </gradient>
        </aapt:attr>
    </path>

</vector>
相关推荐
冬奇Lab1 小时前
Camera2 API架构基础:Android视频系统的大门
android·音视频开发·源码阅读
hnlgzb1 小时前
安卓app kotlin语法,Hilt是什么东西?
android·开发语言·kotlin
Android系统攻城狮3 小时前
Android tinyalsa深度解析之pcm_params_get_periods_min调用流程与实战(一百七十三)
android·pcm·tinyalsa·音频进阶手册
Xempastissimo4 小时前
Android常见界面控件
android
法欧特斯卡雷特4 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·后端·开源
词元Max5 小时前
1.5 Harness 架构深度解析:Claude Code 为什么强?
android·架构
yy55275 小时前
Mysql 主从复制与读写分离
android·数据库·mysql
zhenxin01226 小时前
万字详解 MySQL MGR 高可用集群搭建
android·mysql·adb
做萤石二次开发的哈哈6 小时前
萤石云硬件接入如何完成云对讲套件低代码集成?
android·低代码·rxjava
恋猫de小郭7 小时前
2026 AI 时代下,Flutter 和 Dart 的机遇和未来发展,AI 一体化
android·前端·flutter