web-dev-qa-db-ja.com

Android Button Drawable Tint

AndroidボタンでdrawableLeftに色を付けることはできますか?白に色を付けたい黒のドローアブルがあります。これを画像ビュー(左の画像)で実現する方法を知っています。しかし、デフォルトのAndroidボタンでこれを行いたい。

enter image description here

私のソースコード:

<Button Android:layout_height="wrap_content"
        Android:layout_width="0dp"
        Android:layout_weight="1"
        Android:text="@string/drawer_quizzes"
        Android:backgroundTint="@color/md_light_green_500"
        Android:stateListAnimator="@null"
        Android:textColor="#fff"
        Android:textSize="12dp"
        Android:fontFamily="sans-serif"
        Android:drawableLeft="@drawable/ic_action_landscape"
        Android:gravity="left|center_vertical"
        Android:drawablePadding="8dp"
        />

ボタンに色合いを付ける方法はありますか?または、この効果を達成するためのカスタムビューメソッドはありますか?

29
vigonotion

このメソッドを使用して、ボタンのdrawableleftに色を付けることができます。

手順1:以下に示すように、親要素としてビットマップを使用して描画可能なリソースファイルを作成し、描画可能なフォルダーの下にic_action_landscape.xmlという名前を付けます

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:src="@Android:drawable/ic_btn_speak_now"
    Android:tint="@color/white" />

ステップ2:以下のようにレイアウトにButtonコントロールを作成します

<Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:backgroundTint="@color/md_light_green_500"
        Android:drawableLeft="@drawable/ic_action_landscape"
        Android:drawablePadding="8dp"
        Android:fontFamily="sans-serif"
        Android:gravity="left|center_vertical"
        Android:stateListAnimator="@null"
        Android:text="@string/drawer_quizzes"
        Android:textColor="#fff"
        Android:textSize="12dp" />

このボタンは、@ Android:drawableまたはdrawable pngではなく、drawableフォルダーのic_action_landscape.xmlからdrawableを取得します。

方法2:
ステップ1:
アイコンをアクションバーとして追加したり、カスタムの場所またはクリップアートからインポートできる画像としてフォアグラウンドのタブアイコンを追加することもできます。

ステップ2:
[テーマ]ドロップダウンで[カスタム]を選択します

ステップ3:
次に、前景色の選択で#FFFFFFの色を選択します。 Method 2 Pictorial representation

最後にウィザードを終了して画像を追加し、次にドローアブルを画像として追加します。

Pictorial representation for answer to the question

55
Shadab K

すでにたくさんの答えがあることは知っていますが、要素のスタイルごとに異なるドロウアブルを持ちたくなかったので、それらのどれもが私を幸せにしませんでした。

だから私の解決策は、このようなコンストラクタでカラーフィルターを設定することでした:

int textColor = getTextColors().getColorForState(EMPTY_STATE_SET, Color.WHITE);
    Drawable[] drawables = getCompoundDrawablesRelative();
    for (Drawable drawable : drawables) {
        if(drawable != null) {
            drawable.setColorFilter(textColor, PorterDuff.Mode.SRC_ATOP);
        }
    }

これが必要なものであるため、テキストの色を使用しましたが、より動的にカスタム属性に置き換えることができます。

2
EdgarK

Android:drawableTint="@color/yourColor"を> 23 Androidバージョンで使用できます。

1
Khemraj

@Borisが示唆したように、サポートライブラリを使用できます。

AppCompatButtonを ドラフトコード で拡張しました。 TintAppCompatButton にはデフォルトの動作が必要ですbutTintAppCompatButtonCustom は、カスタムカラーリングをデモするために作成されました。

公式サポートライブラリに入れるためにPRを上げることができるかどうかを確認します。

対象のコードは次のとおりです。

private void init() {
    PorterDuff.Mode tintMode = PorterDuff.Mode.SRC_IN;
    Drawable[] ds = getCompoundDrawables();
    tint(ds[LEFT], Color.RED, tintMode);
    tint(ds[TOP], Color.YELLOW, tintMode);
    tint(ds[RIGHT], Color.GREEN, tintMode);
    tint(ds[BOTTOM], Color.BLUE, tintMode);
}

private void tint(Drawable d, int color, PorterDuff.Mode tintMode) {
    TintInfo ti = new TintInfo();
    ti.mTintMode = tintMode;
    ti.mTintList = ColorStateList.valueOf(color);
    ti.mHasTintList = true;
    ti.mHasTintMode = true;

    TintManager.tintDrawable(d, ti, new int[]{0});
}
1
snodnipper

MaterialButton (おそらくほとんどの人が既に使用しているマテリアルサポートライブラリから)を使用して、これとまったく同じことを達成できました。 MaterialButton には、left/center/right(デフォルトは左)に配置できるiconという名前の属性があります。また、アイコンを着色するiconTintという属性もあります。

Gradle:

implementation "com.google.Android.material:material:1.1.0-alpha09"

見る:

<com.google.Android.material.button.MaterialButton
    Android:layout_width="0dp"
    Android:layout_weight="1"
    Android:text="@string/drawer_quizzes"
    Android:backgroundTint="@color/md_light_green_500"
    Android:stateListAnimator="@null"
    Android:textColor="#fff"
    Android:textSize="12dp"
    Android:fontFamily="sans-serif"
    app:icon="@drawable/ic_action_landscape"
    app:iconTint="@color/white"
    Android:gravity="left|center_vertical"
    Android:drawablePadding="8dp"
    />
0
Matt Wolfe

私はこれに遅れるかもしれませんが、C#を使用している場合は、次のようにできます。

Color iconColor = Color.Orange; // TODO: Get from settings
Mode mode = Mode.SrcAtop;

Drawable drawable = ResourcesCompat.GetDrawable(Resources, Resource.Drawable.ic_action_arrest, null);

drawable.SetColorFilter(iconColor, mode);

次のものも必要です。

using Android.Graphics;
using static Android.Graphics.PorterDuff;
using Android.Graphics.Drawables;

お役に立てれば。私が見つけた最も簡単な方法です。また、このアイコンを使用しているアプリ内のどの場所でも、この色になることに注意してください。

0
GaryP