VectorDrawableは9つの長方形で構成されています。これは、drawablesフォルダーでXMLとして定義されます。これを、xmlで宣言したImageViewの背景として設定しました。 Android:src="@drawable/squares00"
実行時にプログラムで1つまたは複数の正方形の色を変更したいと思います。 VectorDrawableアニメーションを使用してこれを行う方法があることを知っています。しかし、JavaでvectorDrawableにアクセスし、そのプロパティを更新(四角形の1つ以上の塗りつぶし色を設定)し、更新されたVectoDrawableで画像の背景を更新する簡単な方法があるかどうか疑問に思いました。私のターゲットはAndroid API 21(Lollipop)です
要するに:
長いです:
1。アクセス権がありません
ソースコード の VectorDrawable を見ると、内部要素情報が内部private状態クラスVectorDrawableState
。 nameによって内部要素を公開する唯一の方法はgetTargetByName
ですが、残念ながらそれはパッケージプライベート(デフォルト)です-これを使用することはできません(使用しない限り)反射)。
2。 AnimatedVectorDrawable のみアクセス権があります
getTargetByName
は AnimatedVectorDrawable でのみ使用されます。メソッドの 使用状況の検索 で確認できます。
3。 AnimatedVectorDrawableを使用します
これが唯一の利用可能なオプションであることがわかりました。たとえば、次のようにして要素「rect2」の色を白から黒に変更できます。
change_color.xml:
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<objectAnimator
Android:duration="0"
Android:propertyName="fillColor"
Android:valueFrom="@color/white"
Android:valueTo="@color/black"/>
</set>
animation.xml:
<animated-vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:drawable="@drawable/vectordrawable" >
<target
Android:name="rect2"
Android:animation="@anim/change_color" />
</animated-vector>
ここ で説明されているアプローチを使用します。
注
上記の方法で解決できない場合は、次の方法を試してください。
getTargetByName
のリフレクションを使用します。最初にオブジェクトをmutate
することを確認する必要があります。