山寨酷狗更換壁紙,表徵圖的顏色也跟著換,山寨酷狗
上一篇寫了模仿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下載,有興趣的可以看看,酷狗音樂還有模糊背景的,裡面也提供了方法