Androidでベクトルファイルの塗りつぶし色を編集したい。
Xml-fileでは、属性Android:fillColorで色を設定できますが、実行時に色を変更したいです。
そのための例はありますか?ありがとう。
これ はまさに必要なものです。投稿の著者である @ emmaguy へのクレジット。 Support Library 23.4 + の完全なサポートを追加しました。これにより、実行時にpngの生成を停止できます。
// Gradle Plugin 2.0+
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
そして、この行がアクティビティまたはアプリケーションのonCreateに設定されている場合:
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
SVGはsrcCompat
だけでなく、TextView、ToggleButtonなどのdrawableLeft
、background
などの他の属性でも使用できます。セレクターで使用する場合にも機能します。
注:VectorDrawableCompat.create
の代わりにResourcesCompat.getDrawable
を使用するようにコードを変更しました。そうしないと、動作せず、org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector
がスローされます。
まず、2種類の安物の宝石の属性を作成して、色を変更できるようにします。
<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="...." />
<path
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);
それでおしまい!色を変更する場合は、別のテーマを設定するだけで、Drawableが更新されます。完全なサンプルについては、GitHub repo をご覧ください。
色全体を変更する場合は、PorterduffColorFilterを適用できます。しかし、これは単一の<path>
では機能しません。ドロアブル全体に対してのみ。
public void applyThemeToDrawable(Drawable image) {
if (image != null) {
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE,
PorterDuff.Mode.SRC_ATOP);
image.setColorFilter(porterDuffColorFilter);
}
}
VectorDrawableはDrawableクラスを拡張します。 ドキュメントを参照
setColorFilter()
メソッドを画像コンテンツベクトルに追加します(APIレベル8で追加されます)。
imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);