天天看點

V7相容包——調色闆Palette的使用

之前寫過四篇文章是關于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的文本顔色會趨向于高不透明度和高對比度。

下面我們運用一下,按照個人習慣,先貼張效果圖,至于代碼呢。。。太渣了,就不貼了,有興趣的自己下載下傳源碼去看吧。

V7相容包——調色闆Palette的使用

源碼下載下傳

http://download.csdn.net/detail/sbsujjbcy/8563237