如何修复零星的可绘制着色?

时间:2016-12-14 19:18:53

标签: android android-support-library android-drawable

我正在使用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的正确着色?

1 个答案:

答案 0 :(得分:0)

我知道这是旧的,但我遇到了同样的问题。在drawable上调用mutate()可确保它不会与任何其他drawable共享其状态。来自文档:

“默认情况下,从同一资源加载的所有drawables实例共享一个公共状态;如果修改一个实例的状态,则所有其他实例将收到相同的修改”

就我而言,这会引起着色的随机问题。