美文网首页
Android Material Design 之 Palett

Android Material Design 之 Palett

作者: teletian | 来源:发表于2017-08-26 12:53 被阅读64次

    简介

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

    简单使用

    首先添加相应的依赖

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

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

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

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:background="@color/colorPrimary"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.teletian.palette.MainActivity">
    
        <ImageView
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/naruto" />
    
        <View
            android:id="@+id/color1"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:layout_marginTop="5dp" />
    
        <View
            android:id="@+id/color2"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:layout_marginTop="5dp" />
    
        <View
            android:id="@+id/color3"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:layout_marginTop="5dp" />
    
        <View
            android:id="@+id/color4"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:layout_marginTop="5dp" />
    
        <View
            android:id="@+id/color5"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:layout_marginTop="5dp" />
    
        <View
            android:id="@+id/color6"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:layout_marginTop="5dp" />
    
    </LinearLayout>
    

    接下来就是在 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():返回像素的总数

    运行效果如下:

    可以发现下面 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 之 Palett

          本文链接:https://www.haomeiwen.com/subject/wbemdxtx.html