zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android tv 获取第三方icon的颜色,并填充该背景

Android 获取 颜色 第三方 背景 填充 icon TV
2023-09-27 14:28:04 时间

作者:夏至 欢饮转载,也请保留这段申明
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以上的基本没啥问题,但以下的,就兼容性就做得不太好,比如图片地圆角,还得自己重新写,所以这里为了兼容性,只能放弃它了。