web-dev-qa-db-ja.com

プログラムでAndroid Vector Drawableを更新する

VectorDrawableは9つの長方形で構成されています。これは、drawablesフォルダーでXMLとして定義されます。これを、xmlで宣言したImageViewの背景として設定しました。 Android:src="@drawable/squares00"実行時にプログラムで1つまたは複数の正方形の色を変更したいと思います。 VectorDrawableアニメーションを使用してこれを行う方法があることを知っています。しかし、JavaでvectorDrawableにアクセスし、そのプロパティを更新(四角形の1つ以上の塗りつぶし色を設定)し、更新されたVectoDrawableで画像の背景を更新する簡単な方法があるかどうか疑問に思いました。私のターゲットはAndroid API 21(Lollipop)です

28
Jason Porter

要するに:

  1. あなたVectorDrawable の内部要素に直接アクセスできません
  2. AnimatedVectorDrawable は内部要素にのみアクセスできます。
  3. AnimatedVectorDrawable を使用して、必要なものをシミュレートします。

長いです:

1。アクセス権がありません

ソースコードVectorDrawable を見ると、内部要素情報が内部private状態クラスVectorDrawableStatenameによって内部要素を公開する唯一の方法はgetTargetByNameですが、残念ながらそれはパッケージプライベート(デフォルト)です-これを使用することはできません(使用しない限り)反射)。

2。 AnimatedVectorDrawable のみアクセス権があります

getTargetByNameAnimatedVectorDrawable でのみ使用されます。メソッドの 使用状況の検索 で確認できます。

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>

ここ で説明されているアプローチを使用します。

上記の方法で解決できない場合は、次の方法を試してください。

  • VectorDrawable 全体をコピーして微調整します(テストされていません)
  • 内部要素を取得するには、getTargetByNameのリフレクションを使用します。最初にオブジェクトをmutateすることを確認する必要があります。
20
Eyal Biran

内部要素に直接アクセスするには、この library を使用します。これを実装する answer

0
maXp