プログラムで Android のベクター ファイルの塗りつぶしの色を編集したいと考えています。
xml ファイルでは、属性 android:fillColorを使用して色を設定できますが、実行時に色を変更したいと考えています。
その例はありますか?ありがとう。
プログラムで Android のベクター ファイルの塗りつぶしの色を編集したいと考えています。
xml ファイルでは、属性 android:fillColorを使用して色を設定できますが、実行時に色を変更したいと考えています。
その例はありますか?ありがとう。
これはまさにあなたが必要とするものです。投稿の著者である@emaguyの功績。サポート ライブラリ 23.4+の完全なサポートを追加しました。これにより、実行時に png の生成を停止できます。
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
この行がアクティビティまたはアプリケーションの onCreate に設定されている場合:
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
SVG は、TextView や ToggleButton などの 、 などのsrcCompat
他の属性とともに使用するだけでなく、使用することもできます。セレクターで使用した場合にも機能します。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);
それでおしまい!色を変更したい場合は、別のテーマを設定するだけで、ドローアブルが更新されます。完全なサンプルについては、GitHub リポジトリを参照してください。
全体の色を変更したい場合は、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 クラスを拡張します。ドキュメントを見る