在FloatingActionButton中,如何对Android图标进行着色?

9
如何在FloatingActionButton中着色图标资源图片?我尝试了favoriteFab.setColorFilter(R.color.yellow, PorterDuff.Mode.OVERLAY);,但没有成功。

3
我为什么会得到-5分?这只是一个问题而已吗? - fab
1
我自己也在想...可能是缺乏细节吗?不过我能理解这个问题..不知道。 - Nick H
7个回答

9
我假设favoriteFab是你的FloatingActionButton。你可以使用以下代码:
int color = ContextCompat.getColor(this, R.color.yellow);
favoriteFab.getDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);

7
如果您使用的是API 21或更高版本,可以像这样设置可绘制对象的颜色色调。
mFAB.getDrawable().mutate().setTint(getResources().getColor(R.color.yourColor));
例如:
mFAB = (FloatingActionButton) findViewById(R.id.fab);
mFAB.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Snackbar.make(v, "Yummy snackbar", LENGHT_LONG).show();
    }
});
mFAB.getDrawable().mutate().setTint(getResources().getColor(R.color.colorAccent));

更新:由于getColor已被弃用,您应该使用ContextCompat。例如,使用以下代码:

mFAB.getDrawable().mutate().setTint(ContextCompat.getColor(this, R.color.colorAccent));

2
它只能在API> 21上运行。如果要在较低版本的API上使用它,请检查我的答案。 - Rosário Pereira Fernandes

4
Drawable fabDr= mFAB.getDrawable();
DrawableCompat.setTint(fabDr, Color.WHITE);

4
您可以简单地使用support-v4中的DrawableCompat,具体操作如下:

DrawableCompat

    Drawable drawable = mFloatingActionButton.getDrawable();
    // Wrap the drawable so that future tinting calls work
    // on pre-v21 devices. Always use the returned drawable.
    drawable = DrawableCompat.wrap(drawable);

    // We can now set a tint
    DrawableCompat.setTint(drawable, ContextCompat.getColor(this, R.color.white));
    // ...or a tint list
    DrawableCompat.setTintList(drawable, ColorStateList.valueOf(ContextCompat.getColor(this, R.color.white)));

    // ...and a different tint mode
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_OVER);

3

可以使用:

app:tint="#FFFF"       

例子:

<com.google.android.material.floatingactionbutton.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|start"
            android:layout_margin="16dp"
            android:layout_marginEnd="8dp"
            android:layout_marginBottom="8dp"
            app:backgroundTint="@color/colorAccent"
            app:fabSize="normal"
            app:rippleColor="@color/colorPrimaryDark"
            app:tint="#FFFF"
            android:src="@drawable/ic_search_24dp"
          />

2
您可以使用DrawableCompat.setTintList()代替:
Drawable drawable = DrawableCompat.wrap(fab.getDrawable());
DrawableCompat.setTint(drawable, myColorInt);
fab.setImageDrawable(drawable);

当调用getDrawable时,经常会遇到空指针异常,因此需要使用您的解决方案,例如: Drawable drawable = DrawableCompat.wrap(getContext().getResources().getDrawable(R.mipmap.ic_help)); - lucblender

0

或者在 Kotlin 中更加优雅

import androidx.core.graphics.drawable.DrawableCompat.setTint
import com.google.android.material.floatingactionbutton.FloatingActionButton

fun FloatingActionButton.iconTint(color: Int) = setTint(drawable, color)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接