博学的篮球 · 如何在geoJSON中将three.js绘制 ...· 4 周前 · |
傲视众生的碗 · LocalDateTime 格式化 ...· 7 月前 · |
深情的鸡蛋 · 用python写一个倒计时(while ...· 1 年前 · |
寂寞的松树 · javascript - Ext Js ...· 1 年前 · |
时尚的匕首 · sql语句报错:关键字 ‘user‘ ...· 1 年前 · |
我想在Android中以编程方式编辑矢量文件的填充颜色。
在xml文件中,我可以使用属性 android:fillColor 设置颜色,但我想在运行时更改颜色。
有没有这样的例子?谢谢。
发布于 2016-07-17 12:59:33
This 正是您所需要的。归功于这篇文章的作者 @emmaguy 。我刚刚添加了对 Support Library 23.4+ 的完全支持,它使您能够在运行时停止生成pngs:
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
如果在您的活动或应用程序的onCreate上设置了此行:
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
您不仅可以在
srcCompat
中使用SVG,还可以在TextView、ToggleButton等中使用其他属性,如
drawableLeft
、
background
等。如果在选择器上使用,它也可以工作。
注释
:我修改了代码以使用
VectorDrawableCompat.create
而不是
ResourcesCompat.getDrawable
。否则它将无法工作并抛出
org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector
。
中帖子内容:
首先,我们为这两种装饰品创建属性,这样我们就可以改变它们的颜色:
<declare-styleable name="ChristmasTree">
<attr name="bauble_round" format="color" />
<attr name="bauble_small" format="color" />
</declare-styleable>
然后,在VectorDrawable中,设置要动态更改的部件以使用这些属性:
<path
android:fillColor="?attr/bauble_round"
android:pathData="...." />
android:fillColor="?attr/bauble_small"
android:pathData="...." />
...
创建主题并设置要使用的颜色:
<style name="UpdatedScene" parent="DefaultScene">
<item name="bauble_round">#db486e</item>
<item name="bauble_small">#22c7f7</item>
</style>
<style name="DefaultScene">
<item name="bauble_round">#fec758</item>
<item name="bauble_small">#f22424</item>
</style>
在ImageView中使用可绘制:
final ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DefaultScene);
final Drawable drawable = VectorDrawableCompat.create(getResources(), R.drawable.christmas, wrapper.getTheme());
imageView.setImageDrawable(drawable);
就这样!当你想改变颜色时,只需设置一个不同的主题,你的绘图就会更新。有关完整示例,请参阅GitHub repo 。
发布于 2015-10-14 21:51:53
如果你想改变整个颜色,你可以应用一个PorterduffColorFilter。但这不适用于单个
<path>
。只适用于整个抽屉。
public void applyThemeToDrawable(Drawable image) {
if (image != null) {
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE,