我正在查看GradientColor https://developer.android.com/reference/android/R.styleable.html#GradientColor的文档。如何在XML中定义渐变颜色并将其应用于XML矢量drawable?
我在color.xml,styles.xml和XML vector vector中尝试过。
我收到错误"无法将@id / gradclor转换为ColorStateList"用:
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="120dp"
android:height="120dp"
android:viewportWidth="120.0"
android:viewportHeight="120.0">
<path
android:name="play_triangle"
android:pathData="M 30 30 L 30 90 L 80 60 z"
android:strokeColor="@id/gradclor"
android:strokeWidth="5"/>
<color
android:name="@+id/gradclor"
android:startColor="#FFFFFF"
android:endColor="#00FFFF"
android:angle="145"/>
</vector>
或 &#34;无法将#FFFFFFFF#00FFFFFF 145转换为ColorStateList&#34;使用时:
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="120dp"
android:height="120dp"
android:viewportWidth="120.0"
android:viewportHeight="120.0">
<path
android:name="play_triangle"
android:pathData="M 30 30 L 30 90 L 80 60 z"
android:strokeColor="@color/GradientStrokeBorder"
android:strokeWidth="5"/>
</vector>
在color.xml中使用以下内容:
<color name="GradientStrokeBorder">
<item name="android:startColor">#FFFFFF</item>
<item name="android:endColor">#00FFFF</item>
<item name="android:angle">145</item>
</color>
答案 0 :(得分:30)
我终于成功了。 Android Studio中不支持渐变颜色功能(当前版本为2.2),因此它不会帮助您自动完成,而是将渐变标记标记为错误。尽管如此,该功能确实有效,我已经在Nexus 5X / API 24上成功测试过。当然,您必须使用API 24+设备,否则操作系统不支持此功能。
首先,您需要添加颜色资源文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<gradient xmlns:android="http://schemas.android.com/apk/res/android"
android:startColor="#FFFFFF"
android:centerColor="#0000FF"
android:endColor="#00FFFF"
android:angle="145"
android:startX="30"
android:endX="70"
android:startY="30"
android:endY="70"
android:type="linear"/>
请注意开始/结束参数,因为我发现它们对于矢量渐变是必不可少的。
将此文件放在某个名称下的res / color文件夹中。我将它命名为gradient.xml,因此完整路径为res / color / gradient.xml。之后,您可以在颜色属性中引用此资源,包括矢量路径颜色:
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="120dp"
android:height="120dp"
android:viewportWidth="120.0"
android:viewportHeight="120.0">
<path
android:name="play_triangle"
android:pathData="M 30 30 L 30 90 L 80 60 z"
android:strokeWidth="10"
android:strokeColor="@color/gradient"/>
</vector>
请注意strokeColor中对渐变颜色资源的引用。希望这有帮助!
答案 1 :(得分:8)
Android的最新预览(3.1 Canary 6)包含使用带渐变的矢量资源的示例。
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>
答案 2 :(得分:2)
我对此不确定,但根据this document:
机器人:则strokeColor 指定用于绘制路径轮廓的颜色。 可以是颜色,或者对于SDK 24 + ,可以是颜色状态列表或渐变颜色(请参阅GradientColor和GradientColorItem)。如果此属性已设置动画,则动画设置的任何值都将覆盖原始值。如果未指定此属性,则不绘制路径轮廓。
如果你的sdk <24,它应该是一种颜色。
另一方面,如果你的sdk大于24,我认为使用<gradient/>
填补你的路径而不是<color/>