之前寫過四篇文章是關于v7相容包RecyclerView的使用
android v7相容包RecyclerView的使用(四)——點選事件的不同方式處理
android v7相容包RecyclerView的使用(三)——布局管理器的使用
android v7相容包RecyclerView的使用(二)
android v7相容包RecyclerView的使用(一)
今天無意看到一個v7相容包中另一個庫Palette,就學習了下,這個庫有什麼作用呢,說白了就是用它實作動态顔色的設定。
Material Design鼓勵開發者使用動态顔色,尤其是當我們有豐富的圖檔資源要顯示時,v7相容包中的Palette庫就是這樣誕生的,它可以讓我們從一張圖檔中抽取一部分顔色去控制我們的UI元素,進而創造一個沉浸式的體驗,抽取的顔色會包括充滿活力的和柔和的色調,這些色調會使前景文本顔色具有最佳的視覺效果
在我們使用Palette這個庫前,讓我們先将這個依賴檔案從sdk中找出,它在下面這個位置
..\sdk\extras\android\support\v7\palette\libs\android-support-v7-palette.jar
我們建立一個項目,将其複制到libs目錄下。
Palette有兩種使用方法,分别是
- 同步的
- 異步的
同步方法
public static Palette generate(Bitmap bitmap)
使用這個方法得保證你有通路和圖檔加載有關的線程
該方法使用預設的顔色位數(DEFAULT_CALCULATE_NUMBER_COLORS=16),我們可以使用兩個參數的方法指定位數
public static Palette generate(Bitmap bitmap, int numColors)
numColors的最佳值是視圖檔資源類型而定,對于風景圖,12-16最佳,對于人臉的圖檔,該值需要增加到24-32才是最佳的。該值的增加,會增加計算的時間,如果沒有特殊需求,使用預設值即可
下面是一個同步方法的使用例子
Bitmap map=BitmapFactory.decodeResource(getResources(), R.drawable.qblog_fig3);
Palette generate = Palette.generate(map);
Swatch vibrantSwatch = generate.getVibrantSwatch();
TextView tv=(TextView)findViewById(R.id.title);
tv.setTextColor(vibrantSwatch.getRgb());
異步方法
public static AsyncTask<Bitmap, Void, Palette> generateAsync(Bitmap bitmap, PaletteAsyncListener listener)
public static AsyncTask<Bitmap, Void, Palette> generateAsync(
final Bitmap bitmap, final int numColors, final PaletteAsyncListener listener)
兩個方法的差別和同步的兩個方法差別是一樣的,這兩個方法是異步的,使用時需要傳入一個監聽器,該監聽器的原型是
public interface PaletteAsyncListener {
/**
* Called when the {@link Palette} has been generated.
*/
void onGenerated(Palette palette);
}
下面是一個異步方法的使用例子
Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
Palette.Swatch vibrant = palette.getVibrantSwatch();
if (vibrant != null) {
// If we have a vibrant color, update the title TextView
titleView.setBackgroundColor(vibrant.getRgb());
titleView.setTextColor(vibrant.getTitleTextColor());
}
}
});
Palette 的屬性
Palette.Swatch是一個提取顔色的樣本,通過該類可以提取到包含了我們需要的顔色内容
- 傳回一個有活力的顔色. Palette.getVibrantSwatch()
- 傳回一個有活力的暗色. Palette.getDarkVibrantSwatch()
- 傳回一個有活力的亮色. Palette.getLightVibrantSwatch()
- 傳回一個柔和的顔色. Palette.getMutedSwatch()
- 傳回一個柔和的暗色. Palette.getDarkMutedSwatch()
- 傳回一個柔和的亮色. Palette.getLightMutedSwatch()
有活力的顔色和有活力的暗色是開發者使用最多的,具體使用哪一種取決于你自己
Swatch 屬性
- getPopulation(): 傳回被該樣本代表的像素的總數
- getRgb(): 傳回一個 RGB 顔色值
- getHsl(): 傳回一個 HSL顔色值.
- getBodyTextColor(): 傳回一個适合做内容體顔色的顔色值
- getTitleTextColor(): 傳回一個适合做标題顔色的顔色值
标題的文本顔色會趨向于高透明度和低對比度,字型也會應該大一點,body的文本顔色會趨向于高不透明度和高對比度。
下面我們運用一下,按照個人習慣,先貼張效果圖,至于代碼呢。。。太渣了,就不貼了,有興趣的自己下載下傳源碼去看吧。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM1kTNwMjMxEDNwQDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
源碼下載下傳
http://download.csdn.net/detail/sbsujjbcy/8563237