Android Material Design 之 Palette

简介

Palette 即调色板。从图片中提取颜色,然后赋给相应的视图,使界面看起来更加协调好看。

简单使用

首先添加相应的依赖

implementation 'com.android.support:palette-v7:26.0.0'

Android Studio 3.0 开始新建项目默认使用 implementation 了,当然 compile 也能用。

我们给 Layout 文件添加一个 ImageView 和 6 个 View。ImageView 是用来放图片来提取颜色的,提取的颜色分别放到准备的 6 个 View 中。




    

    

    

    

    

    

    


接下来就是在 Activity 中提取,先上代码如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView image = findViewById(R.id.image);
        Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();

        Palette.Builder builder = Palette.from(bitmap);
        builder.generate(new Palette.PaletteAsyncListener() {
            @Override
            public void onGenerated(Palette palette) {

                //充满活力的样本
                Palette.Swatch swath1 = palette.getVibrantSwatch();
                if (swath1 != null) {
                    findViewById(R.id.color1).setBackgroundColor(swath1.getRgb());
                }

                //充满活力的暗色样本
                Palette.Swatch swath2 = palette.getDarkVibrantSwatch();
                if (swath2 != null) {
                    findViewById(R.id.color2).setBackgroundColor(swath2.getRgb());
                }

                //充满活力的亮色样本
                Palette.Swatch swath3 = palette.getLightVibrantSwatch();
                if (swath3 != null) {
                    findViewById(R.id.color3).setBackgroundColor(swath3.getRgb());
                }

                //柔和的样本
                Palette.Swatch swath4 = palette.getMutedSwatch();
                if (swath4 != null) {
                    findViewById(R.id.color4).setBackgroundColor(swath4.getRgb());
                }

                //柔和的暗色样本
                Palette.Swatch swath5 = palette.getDarkMutedSwatch();
                if (swath5 != null) {
                    findViewById(R.id.color5).setBackgroundColor(swath5.getRgb());
                }

                //柔和的亮色样本
                Palette.Swatch swath6 = palette.getLightMutedSwatch();
                if (swath6 != null) {
                    findViewById(R.id.color6).setBackgroundColor(swath6.getRgb());
                }
            }
        });
    }
}

Palette 对象的生成有两种方法,例子中的是异步生成,还可以同步生成,代码如下:

Palette.Builder bulider = Palette.from(bitmap);
Palette palette = bulider.generate();

推荐使用异步,尤其是图片大小比较大的时候。

提取颜色提供了 6 中不同的颜色,详见代码注释。

除了提取 rgb 颜色,还可以提取其他信息:
getTitleTextColor():返回适合标题的颜色
getBodyTextColor():返回适合文本内容的颜色
getTitleTextColor():返回float[],可以进行修改,后使用ColorUtils工具类进行转换
getPopulation():返回像素的总数

运行效果如下:

Android Material Design 之 Palette_第1张图片

可以发现下面 6 中颜色只有 5 中颜色显示出来了,其中 "充满活力的暗色样本" 没有显示。也就是说 Palette 获取的样本是可能没有值的。但是 "充满活力的样本" 和其他不一样,始终有值。

使用场景

Palette 到底实际应用中有什么用呢,下面通过一个例子来展示一下其中一种使用场景。

先来看下效果:

ViewPager 滑动的时候,根据图片的颜色,改变 StatusBar,Toolbar,TabLayout,NavigationBar 的颜色。

Palette 的基本使用既然已经在上文中讲解过了,这边就不再啰嗦了。
例子中使用到了 Toolbar 和 TabLayout,如果不熟悉的话,可以参照我之前写的文章↓
Android Material Design 之 Toolbar
Android Material Design 之 TabLayout

所以直接看源码吧!

源码

基本使用
https://github.com/teletian/Android/tree/master/MaterialDesignSamples/Palette

ViewPager 滑动改变颜色
https://github.com/teletian/Android/tree/master/MaterialDesignSamples/PaletteWithViewPager

你可能感兴趣的:(Android Material Design 之 Palette)