上一篇写了模仿QQ更换主题的思路跟实现,看到酷狗音乐更换壁纸,图标的颜色也跟着换,这种也相当于更换了一套主题,挺有意思的,现在也山寨一下,写写它是怎样实现的。
从图片中可以看出来,图标更换的颜色,是壁纸的主要颜色(试了一些壁纸,并不是这样的,有些并不是图片的主要颜色,不知是否是过滤掉一些颜色,给它个默认颜色值,也不像是使用Palette里提取的颜色,这里就讲提取主颜色吧),那么第一步,就是要获取一张图片的主要颜色,前面一篇博客,android L Palette 的实现原理有讲到,如何将一张图片,把各种颜色分类,以直方图的显示,这里,我们只需要从这个颜色直方图里面拿到其中最高的那一柱,我在ColorHistogram这个类里加多了个方法,就是提取主颜色的,如果靠近黑色或白色的是最高的那一柱,就过滤掉,拿另外一柱比较高的(mColors保存的是图片的各种颜色,mColorCounts是保存对应的这种颜色的数量或说有多高)
int maxColorCount = 0; public int getMainColor(){ for(int i=0;i<mColors.length;i++){ if(ColorUtils.shouldIgnoreColor(mColors[i])){ continue; } if(maxColorCount<mColorCounts[i]){ maxColorCount = mColorCounts[i]; maxColorIndex = i; } } return mColors[maxColorIndex]; }
拿到了这个颜色,再替换原来图片的颜色,那就ok了
private static Drawable getDrawable(Context context,int drawableID,int beColor) { Bitmap bm = BitmapFactory.decodeResource(context.getResources(), drawableID); int w = bm.getWidth(); int h = bm.getHeight(); int px[] = new int[w * h]; bm.getPixels(px, 0, w, 0, 0, w, h); for (int i = 0; i < px.length; i++) { int r = Color.red(px[i]); int g = Color.green(px[i]); int b = Color.blue(px[i]); int a = Color.alpha(px[i]); // Log.d("color rgba", "" + r + "," + g + "," + b + "," + a); if (r > 240 && g > 240 && b > 240) {//因为酷狗的那些需要替换的图标颜色都是白色的,rgb都是255,也只需要换掉rgb对应的值,这里使用原///来的透明度很重要,因为rgb是255,但它原来的a不一定是255,才使得图片看起来好看 r = Color.red(beColor); g = Color.green(beColor); b = Color.blue(beColor); px[i] = Color.argb(a, r, g, b); } } bm = Bitmap.createBitmap(px, 0, w, w, h, Bitmap.Config.ARGB_8888); return new BitmapDrawable(bm); }这里主要的就是这两个方法了,看看效果
demo下载,有兴趣的可以看看,酷狗音乐还有模糊背景的,里面也提供了方法