山寨酷狗更换壁纸,图标的颜色也跟着换

上一篇写了模仿QQ更换主题的思路跟实现,看到酷狗音乐更换壁纸,图标的颜色也跟着换,这种也相当于更换了一套主题,挺有意思的,现在也山寨一下,写写它是怎样实现的。

山寨酷狗更换壁纸,图标的颜色也跟着换_第1张图片山寨酷狗更换壁纸,图标的颜色也跟着换_第2张图片

从图片中可以看出来,图标更换的颜色,是壁纸的主要颜色(试了一些壁纸,并不是这样的,有些并不是图片的主要颜色,不知是否是过滤掉一些颜色,给它个默认颜色值,也不像是使用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下载,有兴趣的可以看看,酷狗音乐还有模糊背景的,里面也提供了方法



你可能感兴趣的:(山寨酷狗更换壁纸,图标的颜色也跟着换)