Palette调色板的演示

Palette的翻译是调色板,也就是对于颜色的控制。

具体有什么特效是可以让Palette发挥出它的光彩呢,看以下的动图。
palette动图

Palette强大的地方在于可以抽取图片当中突出的颜色,然后设置到状态栏,标题栏等地方,使之整体的主题随之变动,非常协调。以前用天天动听的时候就存在这种效果,换歌的时候歌星的专辑图改变了,整个界面的颜色会变成专辑图当中突出的颜色。那时候就一直觉得很神奇,现在发现实现起来却是这么的简单。(从诺基亚开始,一直用天天动听的用户)

使用之前,我们先引入对应的依赖包:

compile 'com.android.support:palette-v7:25.3.1'

Palette可以提取的颜色分类分别是:
- Vibrant (有活力的)
- Vibrant dark(有活力的 暗色)
- Vibrant light(有活力的 亮色)
- Muted (柔和的)
- Muted dark(柔和的 暗色)
- Muted light(柔和的 亮色)

使用方法:

获得一张图片突出的颜色:

同步

/**
     * 根据Palette提取的颜色,修改tab和toolbar以及状态栏的颜色
     */
    private void changeTopBgColor2(int position) {
        // 用来提取颜色的Bitmap
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.pic_one);
        // Palette的部分
        Palette.Builder builder = Palette.from(bitmap);
        Palette palette= builder.generate();

        //获取到充满活力的这种色调
        Palette.Swatch vibrant = palette.getVibrantSwatch();
        //根据调色板Palette获取到图片中的颜色设置到toolbar和tab中背景,标题等,使整个UI界面颜色统一
        mTabLayout.setBackgroundColor(vibrant.getRgb());
        mTabLayout.setSelectedTabIndicatorColor(colorBurn(vibrant.getRgb()));
        toolbar.setBackgroundColor(vibrant.getRgb());

        if (android.os.Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.setStatusBarColor(colorBurn(vibrant.getRgb()));
            window.setNavigationBarColor(colorBurn(vibrant.getRgb()));
        }
    }

异步

/**
     * 根据Palette提取的颜色,修改tab和toolbar以及状态栏的颜色
     */
    private void changeTopBgColor(int position) {
        // 用来提取颜色的Bitmap
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), myViewPagerAdapter.getItem(position)
                .getBackgroundBitmapPosition(position));
        // Palette的部分
        Palette.Builder builder = Palette.from(bitmap);
        builder.generate(new Palette.PaletteAsyncListener() {
            @Override
            public void onGenerated(Palette palette) {
                //获取到充满活力的这种色调
                Palette.Swatch vibrant = palette.getVibrantSwatch();
                //根据调色板Palette获取到图片中的颜色设置到toolbar和tab中背景,标题等,使整个UI界面颜色统一
                mTabLayout.setBackgroundColor(vibrant.getRgb());
                mTabLayout.setSelectedTabIndicatorColor(colorBurn(vibrant.getRgb()));
                toolbar.setBackgroundColor(vibrant.getRgb());

                if (android.os.Build.VERSION.SDK_INT >= 21) {
                    Window window = getWindow();
                    window.setStatusBarColor(colorBurn(vibrant.getRgb()));
                    window.setNavigationBarColor(colorBurn(vibrant.getRgb()));
                }
            }
        });
    }

接下来会用一个例子来说明使用方法,一般都是搭配Toolbar+TabLayout+ViewPager+Fragment这些来使用的。

主界面的布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/tablayout_coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/tablayout_appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppBaseTheme">

        <android.support.v7.widget.Toolbar
            android:id="@+id/tablayout_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            app:navigationIcon="@mipmap/ic_launcher">

        </android.support.v7.widget.Toolbar>

        <android.support.design.widget.TabLayout
            android:id="@+id/tablayout_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabIndicatorColor="#26c6da"
            app:tabSelectedTextColor="#ff0000">

        </android.support.design.widget.TabLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/tablayout_viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <!--@string/appbar_scrolling_view_behavior-->

    </android.support.v4.view.ViewPager>


</android.support.design.widget.CoordinatorLayout>

代码实现效果:

扫描二维码关注公众号,回复: 2811731 查看本文章
package com.voctex.ui.tablayout.view;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Window;

import com.voctex.R;
import com.voctex.base.BaseActivity;
import com.voctex.ui.tablayout.adapter.MyViewPagerAdapter;

/**
 * Created by mac_xihao on 17/6/28.
 */
public class TabLayoutUIA extends BaseActivity {

    private MyViewPagerAdapter myViewPagerAdapter;
    private ViewPager mViewPager;
    private TabLayout mTabLayout;
    private Toolbar toolbar;

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

        initView();
    }

    private void initView() {

        final CoordinatorLayout coordinatorLayout = ((CoordinatorLayout) findViewById(R.id.tablayout_coordinator));
        AppBarLayout appBarLayout = ((AppBarLayout) findViewById(R.id.tablayout_appbar));
        toolbar = ((Toolbar) findViewById(R.id.tablayout_toolbar));
        mTabLayout = ((TabLayout) findViewById(R.id.tablayout_tabs));
        mViewPager = ((ViewPager) findViewById(R.id.tablayout_viewpager));

        toolbar.setTitle("TabLayout界面");
        setSupportActionBar(toolbar);
        //要在setSupportActionBar方法之后调用才会才生效
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        mTabLayout.addTab(mTabLayout.newTab().setText("TabOne"));//给TabLayout添加Tab
        mTabLayout.addTab(mTabLayout.newTab().setText("TabTwo"));
        mTabLayout.addTab(mTabLayout.newTab().setText("TabThree"));
        mTabLayout.setupWithViewPager(mViewPager);
        //给TabLayout设置关联ViewPager,如果设置了ViewPager,那么ViewPagerAdapter中的getPageTitle()方法返回的就是Tab上的标题

        myViewPagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager());
        myViewPagerAdapter.addFragment(OneTabLayoutUIF.newInstance(), "TabOne");//添加Fragment
        myViewPagerAdapter.addFragment(TwoTabLayoutUIF.newInstance(), "TabTwo");
        myViewPagerAdapter.addFragment(ThrTabLayoutUIF.newInstance(), "TabThree");
        mViewPager.setAdapter(myViewPagerAdapter);//设置适配器
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                changeTopBgColor(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        changeTopBgColor(0);

    }

    /**
     * 根据Palette提取的颜色,修改tab和toolbar以及状态栏的颜色
     */
    private void changeTopBgColor(int position) {
        // 用来提取颜色的Bitmap
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), myViewPagerAdapter.getItem(position)
                .getBackgroundBitmapPosition(position));
        // Palette的部分
        Palette.Builder builder = Palette.from(bitmap);
        builder.generate(new Palette.PaletteAsyncListener() {
            @Override
            public void onGenerated(Palette palette) {
                //获取到充满活力的这种色调
                Palette.Swatch vibrant = palette.getVibrantSwatch();
                //根据调色板Palette获取到图片中的颜色设置到toolbar和tab中背景,标题等,使整个UI界面颜色统一
                mTabLayout.setBackgroundColor(vibrant.getRgb());
                mTabLayout.setSelectedTabIndicatorColor(colorBurn(vibrant.getRgb()));
                toolbar.setBackgroundColor(vibrant.getRgb());

                if (android.os.Build.VERSION.SDK_INT >= 21) {
                    Window window = getWindow();
                    window.setStatusBarColor(colorBurn(vibrant.getRgb()));
                    window.setNavigationBarColor(colorBurn(vibrant.getRgb()));
                }
            }
        });
    }

    /**
     * 颜色加深处理
     *
     * @param RGBValues RGB的值,由alpha(透明度)、red(红)、green(绿)、blue(蓝)构成,
     *                  Android中我们一般使用它的16进制,
     *                  例如:"#FFAABBCC",最左边到最右每两个字母就是代表alpha(透明度)、
     *                  red(红)、green(绿)、blue(蓝)。每种颜色值占一个字节(8位),值域0~255
     *                  所以下面使用移位的方法可以得到每种颜色的值,然后每种颜色值减小一下,在合成RGB颜色,颜色就会看起来深一些了
     * @return
     */
    private int colorBurn(int RGBValues) {
        int alpha = RGBValues >> 24;
        int red = RGBValues >> 16 & 0xFF;
        int green = RGBValues >> 8 & 0xFF;
        int blue = RGBValues & 0xFF;
        red = (int) Math.floor(red * (1 - 0.1));
        green = (int) Math.floor(green * (1 - 0.1));
        blue = (int) Math.floor(blue * (1 - 0.1));
        return Color.rgb(red, green, blue);
    }

}

这里的Fragment都需要继承于PaletteUIF,其实也就是几行代码而已:

package com.voctex.ui.tablayout.view;

import com.voctex.R;
import com.voctex.base.BaseFragment;

/**
 * Created by mac_xihao on 17/7/11.
 * PaletteUIF
 */
public abstract class PaletteUIF extends BaseFragment {

    private static final int[] drawables = {R.mipmap.pic_one, R.mipmap.pic_two, R.mipmap.pic_four, R.mipmap
            .pic_three, R.mipmap.pic_five};

    /**
     * 提供当前Fragment的主色调的Bitmap对象,供Palette解析颜色
     *
     * @return
     */
    public static int getBackgroundBitmapPosition(int selectViewPagerItem) {
        return drawables[selectViewPagerItem];
    }
}

演示到此为止,具体代码可以直接导下我的项目进行查看。
https://github.com/voctex/Kepler

QQ:361561789
可事可以直接加Q联系

猜你喜欢

转载自blog.csdn.net/chen_xi_hao/article/details/75086527
今日推荐