我正在使用android支持库,除了有限数量的小部件,这些小部件用主题中定义的颜色accentColor着色,我想在我的应用程序中使用其他一些其他drawable。 我通过以下代码执行此操作:
public class ActivityTest extends AppCompatActivity {
protected void tintDrawable(int color, int drawableId) {
Drawable drawable = DrawableCompat.wrap(ContextCompat.getDrawable(this, drawableId));
DrawableCompat.setTint(drawable, color);
}
protected void tintDrawables() {
int colorPrimary = getColorFromAttributeId(this, R.attr.colorPrimary);
tintDrawable(colorPrimary, R.drawable.drawable_1);
tintDrawable(colorPrimary, R.drawable.drawable_2);
tintDrawable(colorPrimary, R.drawable.drawable_3);
tintDrawable(colorPrimary, R.drawable.drawable_4);
tintDrawable(colorPrimary, R.drawable.drawable_5);
tintDrawable(colorPrimary, R.drawable.drawable_6);
}
public static int getColorFromAttributeId(Context context, int resourceAttributeId) {
int[] attributes = new int[] { resourceAttributeId };
TypedArray typedArray = context.obtainStyledAttributes(attributes);
int color = typedArray.getColor(0, Color.TRANSPARENT);
typedArray.recycle();
return color;
}
protected void doSetPreferencedThemeOnCreateSetContentView(Bundle savedInstanceState, int layoutResourceId) {
/* Catch 22:
* This order must be used otherwise an exception is thrown or theme is not applied.
* 1. setTheme()
* 1.b tintDrawables only after the theme is known we can get the color
* 2. onCreate()
* 3. setContentView() *
* 4. setSupportActionBar() */
// Apply theme. This must be done before super.onCreate()
setTheme(R.style.Theme_Custom_Theme); // in real case theme is retrieved from preferences
tintDrawables();
super.onCreate(savedInstanceState);
setContentView(layoutResourceId);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
doSetPreferencedThemeOnCreateSetContentView(savedInstanceState, R.layout.activity_test);
}
}
看起来很复杂,但很容易理解。问题是我的drawables是“随机”着色的。有些是,有些不是并保留原始png中设置的颜色。更糟糕的是,如果我离开活动并回来,结果可能会有所不同。可能有更多的抽屉被正确着色或更少。 我猜测的是,着色是异步的,并且在将色调应用于所有drawable之前创建布局。但这只是猜测。 这个问题很烦人,因为我的UI依赖于正确的着色,白色背景上的白色图标没有多大用处。黑色也不是黑色。 如何加强对drawables的正确着色?
答案 0 :(得分:0)
我知道这是旧的,但我遇到了同样的问题。在drawable上调用mutate()可确保它不会与任何其他drawable共享其状态。来自文档:
“默认情况下,从同一资源加载的所有drawables实例共享一个公共状态;如果修改一个实例的状态,则所有其他实例将收到相同的修改”
就我而言,这会引起着色的随机问题。