21

Android Studio バージョン 2.1、gradle バージョン 2.1.0、誤解を見つけたら訂正してください :)

サポート ライブラリ 23.3.0 のサポート ベクターについて混乱しています。具体的には、srcが定義されている画像ボタンをプログラムで着色することです。これは、ベクタードローアブルです。私が言えることから、これは今のプレロリポップでは不可能です.

変更に関するいくつかの関連記事を読みました: 23.2.0 の発表と変更:

Android サポート ライブラリ 23.3.0 の時点で、サポート ベクター ドローアブルは app:srcCompat または setImageResource() を介してのみロードできます。

上記は、ベクトル xml は srcCompat または setImageResource() を介して Lollipop より前にのみ使用できるため、動的に着色できないことを意味しますか?

これが私の基本的な画像ボタンです:

<ImageButton
    android:id="@+id/nav_header_exit_community_button"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:background="@null"/>

Lollipop 以降でのみ動作:

    Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp);
    DrawableCompat.setTint(bg, headerTitleColor);
    exitButton.setImageDrawable(bg);

このロリポップ前のスローを試みると、次のようになります。 android.content.res.Resources$NotFoundException: File res/drawable/ic_exit_to_app_24dp.xml from drawable resource ID #0x7f0200bf

また、Lollipop 以降でのみ動作します

    Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp);
    DrawableCompat.setTint(bg, headerTitleColor);
    exitButton.setImageResource(R.drawable.ic_exit_to_app_24dp);

これにより、Lollipop の前に同じエラーがスローされます。

ただし、ここで Ian LakevectorDrawables.useSupportLibrary = trueが指摘したように削除すると、ビルド ツールが Lollipop 以前のデバイス用に png を自動生成することを意図して、png は pre-lollipopで色付けされないため、スクエア 1 に戻ります。

また、ベクターを経由して指定し、プログラムで取得しようとしましたが、代わりにsrcCompat使用してベクターを指定した場合、ポストロリポップで動作しますが、それを達成できたとは思いません。src

したがって、23.3.0 の状況は次のようになります。

  • Post-Lollipop:ベクトルsrcsrcCompat受け入れ、srcプログラムで着色するためのドローアブルとしてのみビューから取得できます。getDrawable を使用してコード内でベクトルを参照することが可能で、着色することができます。

  • Lollipop 導入前: srcCompat はベクトルのみを受け入れることができ、着色のためにビューからプログラムで取得することはできません。 setImageResourceはベクトルを受け入れることができますが、 の場合のみvectorDrawables.useSupportLibrary = falseで、色合いが機能しません 同様に、色付けが機能しない場合を除き、コード内でベクトルを参照することはできvectorDrawables.useSupportLibrary = falseません。

PNGを使用してすべてのバージョンに取り組んでいます:

   Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_nav_exit_community);
   DrawableCompat.setTint(bg, headerTitleColor);
   exitButton.setImageDrawable(bg);

補遺:

この手法はロリポップ後でも機能しますが、ロリポップ前の他の手法と同様に、ドローアブルを取得しますが、色付けは行いません。

    Drawable bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null);
    DrawableCompat.setTint(bg, headerTitleColor);
    exitButton.setImageDrawable(bg);

解決策の種類:

ジョンの答えのおかげで、これまでのところ、サポートベクターに色を付けるために思いつくことができる唯一の確実な方法は、カラーフィルターを設定することです。これはDrawableCompat.setTint()、問題のドローアブルがサポートベクターである場合、関数が機能していないように見えることを意味します. これが正当なバグなのか、予想される動作なのか、それとも私が何か間違ったことをしているだけなのかはわかりません!

これが私が今のところ行っている解決策です:

    Drawable bg;
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null);
        exitButton.setColorFilter(headerTitleColor, PorterDuff.Mode.MULTIPLY);
    }
    else {
        bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp);
        DrawableCompat.setTint(bg, headerTitleColor);
    }
    exitButton.setImageDrawable(bg);
4

3 に答える 3

37

まず、 を使用する必要VectorDrawableCompat#createがあります。取得したら、次のDrawableように呼び出す必要がありDrawableCompat#wrapます。

このクラスの着色メソッドを介して、さまざまな API レベルでの着色に使用できるように、潜在的にドローアブルをラップします。

コードは次のようになります。

ImageView iv = ....
Drawable d = VectorDrawableCompat.create(getResources(), R.drawable.ic_exit_to_app_24dp, null);
d = DrawableCompat.wrap(d);
DrawableCompat.setTint(d, headerTitleColor);
iv.setImageDrawable(d);
于 2016-04-28T06:51:57.043 に答える
9

ImageView のsetColorFilterメソッドを使用できます。

imageView.setColorFilter(headerTitleColor, android.graphics.PorterDuff.Mode.MULTIPLY);

于 2016-04-27T18:47:55.243 に答える