作者:夏至 欢饮转载,也请保留这段申明
http://blog.csdn.net/u011418943/article/details/64905565
在Android TV 上,最常看到的就是把安装的软件,用gridview 或者 recyclerview 显示出来,那么,如果使它的背景看起来好看又不显得花花绿绿呢?首先先一张效果图:
至于如何获取应用,那么自行搜索把。
从上面这张图看起来,是不是看起来违和感不是那么大?虽然那几个绿色的破坏了一些,那么怎么实现的呢?
其实,这个在Android 5.0 之后推出的palette,通过这个方法,我们就可以从一张 bitmap 中提取我们需要的颜色,然后填充该背景颜色即可。
所以,你需要在 gradle 中配置:
compile 'com.android.support:palette-v7:25.1.0'
首先,我们先把第三方的icon提取出来,并转换成 bitmap:
holder.itemView.setFocusable(true);
BitmapDrawable drawable = (BitmapDrawable)mAppContentList.get(position).getAppIcon();
Bitmap bitmap = drawable.getBitmap();
if (bitmap != null){
//根据应用app的颜色来改变它的背景
AppUtils.changeAppBackground(mContext,bitmap,holder.appLayout);
}
当检测到 bitmap 不为空时,我们就执行获取icon颜色,并更改背景的函数,其中 changeAppBackground 函数如下:
public static void changeAppBackground(final Activity context, Bitmap bitmap, final RelativeLayout layout){
Palette.Builder builder = Palette.from(bitmap); //获取Palette实例
builder.maximumColorCount(24);
AsyncTask<Bitmap, Void, Palette> generate = builder.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(final Palette palette) {
//由于是异步加载,所以,则必须处理Swatch为null的情况
Palette.Swatch vibrant = palette.getVibrantSwatch(); //获取活力色调
if (vibrant != null) {
layout.setBackground( setAppItemBackgroud(vibrant.getRgb()));
} else {
// 有活力的暗色
Palette.Swatch darkVibrant = palette.getDarkVibrantSwatch();
if (darkVibrant != null) layout.setBackground( setAppItemBackgroud(darkVibrant.getRgb()));
else {
// 有活力的亮色
Palette.Swatch lightVibrant = palette.getLightVibrantSwatch();
if (lightVibrant != null) layout.setBackground( setAppItemBackgroud(lightVibrant.getRgb()));
else {
// 柔和的颜色
Palette.Swatch muted = palette.getMutedSwatch();
if (muted != null) layout.setBackground( setAppItemBackgroud(muted.getRgb()));
else {
// 柔和的暗色
Palette.Swatch darkMuted = palette.getDarkMutedSwatch();
if (darkMuted != null)
layout.setBackground( setAppItemBackgroud(darkMuted.getRgb()));
else {
// 柔和的亮色
Palette.Swatch lightMuted = palette.getLightMutedSwatch();
if (lightMuted != null)
layout.setBackground( setAppItemBackgroud(lightMuted.getRgb()));
}
}
}
}
}
}
});
}
可以看到,我们用Palette.Builder builder = Palette.from(bitmap);获取 bitmap 的实例, builder.maximumColorCount(24),是设置颜色的值,这里选择24,你也可以选择16或者32,同时,palette的加载时有同步和异步之分,这里我选择异步加载,避免加载过多时卡顿的问题;可能你会有疑问,为什么 Palette.Swatch 要写那么多种,因为,只是一种 Swatch 有时无法获取到icon的颜色,这个时候会返回null,那么你的程序如果没有做null的处理的话,必定会崩溃的,所以,为了避免这种情况,我全部的都写了。
当然,圆角我们还是要重新处理的:
/**
* java代码中重新定义圆角
* @param rgb
*/
private static GradientDrawable setAppItemBackgroud(int rgb) {
int roundRadius = 12; //
int fillColor = rgb;
GradientDrawable gd = new GradientDrawable();
gd.setColor(fillColor);
gd.setCornerRadius(roundRadius);
gd.setAlpha(200);
return gd;
}
当然,你也可以使用cardview,它可以非常方便得实现圆角和阴影的效果;但是这个控件在5.0以上的基本没啥问题,但以下的,就兼容性就做得不太好,比如图片地圆角,还得自己重新写,所以这里为了兼容性,只能放弃它了。