31

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

4

3 に答える 3

23

要するに:

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

長いです:

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

VectorDrawableソース コードを見ると、内部要素の情報が内部のプライベートステート クラスに格納されていることがわかります。内部要素を名前で公開する唯一の方法は ですが、残念ながらそれはパッケージ プライベート (デフォルト) であり、使用できません (リフレクションを使用しない限り)。VectorDrawableStategetTargetByName

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>

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

ノート

上記の方法がまだ選択できない場合は、次の方法を試すことができます。

  • VectorDrawable全体をコピーして微調整します (未テスト)
  • リフレクションを使用しgetTargetByNameて内部要素を取得します。mutate最初にオブジェクトを確認する必要があります。
于 2015-08-14T10:02:56.607 に答える