Android tv 获取第三方icon的颜色,并填充该背景
作者:夏至 欢饮转载,也请保留这段申明
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以上的基本没啥问题,但以下的,就兼容性就做得不太好,比如图片地圆角,还得自己重新写,所以这里为了兼容性,只能放弃它了。
相关文章
- Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?
- Android-获取系统的应用程序的信息
- IDEA 最新版2022.3.2 创建Android新空项目时:Cannot resolve symbol ‘R‘错误原因和解决方法
- Android Binder原理(五)系统服务的获取过程
- 腾讯Android自动化测试实战3.3.1 控件ID相同时获取控件
- android USB
- 详解Android中的四大组件之一:Activity详解
- 《Android游戏开发详解》一2.13 调用对象的行为
- android TextView 设置部分文字背景色 和 文字颜色
- Android 打造形形色色的进度条 实现可以如此简单
- Android 获取本地外网IP、内网IP、计算机名等信息
- android开发获取屏幕高度和宽度
- Android studio 自动导入(全部)包 import (转)
- 利用drozer进行Android渗透测试
- Android内核三大核心功能之一AMS内部原理
- Android系统时间制式的获取(24小时制式/12小时制式)及UTC与本地时间的转换
- Android中通过反射获取资源Id
- Android Studio 基础 之 获取 Wifi 的状态,设置 Wifi 的开关状态,并监听 Wifi 的状态变化方法整理
- Android 8.0 正式发布,Google 带来了哪些新功能?
- Android 调用webservice并解析