天天看点

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