之前写过四篇文章是关于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的文本颜色会趋向于高不透明度和高对比度。
下面我们运用一下,按照个人习惯,先贴张效果图,至于代码呢。。。太渣了,就不贴了,有兴趣的自己下载源码去看吧。
源码下载
http://download.csdn.net/detail/sbsujjbcy/8563237