博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Materail Design 入门(十一)——Palette 使用
阅读量:2082 次
发布时间:2019-04-29

本文共 6220 字,大约阅读时间需要 20 分钟。

Palette简介

可以从一张图片中提取颜色,我们可以把提取的颜色融入到App UI中,可以使UI风格更加美观融洽。比如,我们可以从图片中提取颜色设置给ActionBar做背景颜色,这样ActionBar的颜色就会随着显示图片的变化而变化。

Palette可以提取的颜色如下:

  • Vibrant (有活力的)
  • Vibrant dark(有活力的 暗色)
  • Vibrant light(有活力的 亮色)
  • Muted (柔和的)
  • Muted dark(柔和的 暗色)
  • Muted light(柔和的 亮色)

Palette的使用

1、添加依赖

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

2、如何获取Palette对象

Palette.Builder提供了同步和异步两种方式来生成Palette对象。

// 同步 Palette p = Palette.from(bitmap).generate(); // 异步  Palette.from(bitmap).generate(new PaletteAsyncListener() {     public void onGenerated(Palette p) {         // Use generated instance     } });

如果图片过大使用generate方法,可能会阻塞主线程,我们更倾向于使用generateAsync的方法,其实内部就是创建了一个AsyncTask。generateAsync方法需要一个PaletteAsyncListener对象用于监听生成完毕的回调。除了必须的Bitmap参数外,还可以传入一个numColors参数指定颜色数,默认是 16。

3、获取颜色值

Palette.getVibrantSwatch()Palette.getDarkVibrantSwatch()Palette.getLightVibrantSwatch()Palette.getMutedSwatch()Palette.getDarkMutedSwatch()Palette.getLightMutedSwatch()

使用颜色,上面get方法中返回的是一个 Swatch 样本对象,这个样本对象是Palette的一个内部类,它提供了一些获取最终颜色的方法。

getPopulation(): 样本中的像素数量getRgb(): 颜色的RBG值getHsl(): 颜色的HSL值getBodyTextColor(): 主体文字的颜色值getTitleTextColor(): 标题文字的颜色值

通过 getRgb() 可以得到最终的颜色值并应用到UI中。getBodyTextColor() 和 getTitleTextColor() 可以得到此颜色下文字适合的颜色,这样很方便我们设置文字的颜色,使文字看起来更加舒服。

4、例子

private void initViews() {      mToolbar = (Toolbar) findViewById(R.id.toolbar);      // toolbar.setLogo(R.drawable.ic_launcher);      mToolbar.setTitle("Rocko");// 标题的文字需在setSupportActionBar之前,不然会无效      // toolbar.setSubtitle("副标题");      setSupportActionBar(mToolbar);      /* 这些通过ActionBar来设置也是一样的,注意要在setSupportActionBar(toolbar);之后,不然就报错了 */      // getSupportActionBar().setTitle("标题");      // getSupportActionBar().setSubtitle("副标题");      // getSupportActionBar().setLogo(R.drawable.ic_launcher);      /* 菜单的监听可以在toolbar里设置,也可以像ActionBar那样,通过下面的两个回调方法来处理 */      mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {          @Override          public boolean onMenuItemClick(MenuItem item) {              switch (item.getItemId()) {              case R.id.action_settings:                  Toast.makeText(MainActivity.this, "action_settings", 0).show();                  break;              case R.id.action_share:                  Toast.makeText(MainActivity.this, "action_share", 0).show();                  break;              default:                  break;              }              return true;          }      });      getSupportActionBar().setDisplayHomeAsUpEnabled(true);      /* findView */      mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);      mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.drawer_open,              R.string.drawer_close);      mDrawerToggle.syncState();      mDrawerLayout.setDrawerListener(mDrawerToggle);      mPagerSlidingTabStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs);      mViewPager = (ViewPager) findViewById(R.id.pager);      mViewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));      mPagerSlidingTabStrip.setViewPager(mViewPager);      mPagerSlidingTabStrip.setOnPageChangeListener(new OnPageChangeListener() {          @Override          public void onPageSelected(int arg0) {              colorChange(arg0);          }          @Override          public void onPageScrolled(int arg0, float arg1, int arg2) {          }          @Override          public void onPageScrollStateChanged(int arg0) {          }      });      initTabsValue();  }  /**  * mPagerSlidingTabStrip默认值配置  *   */  private void initTabsValue() {      // 底部游标颜色      mPagerSlidingTabStrip.setIndicatorColor(Color.BLUE);      // tab的分割线颜色      mPagerSlidingTabStrip.setDividerColor(Color.TRANSPARENT);      // tab背景      mPagerSlidingTabStrip.setBackgroundColor(Color.parseColor("#4876FF"));      // tab底线高度      mPagerSlidingTabStrip.setUnderlineHeight((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,              1, getResources().getDisplayMetrics()));      // 游标高度      mPagerSlidingTabStrip.setIndicatorHeight((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,              5, getResources().getDisplayMetrics()));      // 选中的文字颜色      mPagerSlidingTabStrip.setSelectedTextColor(Color.WHITE);      // 正常文字颜色      mPagerSlidingTabStrip.setTextColor(Color.BLACK);  }  /**  * 界面颜色的更改  */  @SuppressLint("NewApi")  private void colorChange(int position) {      // 用来提取颜色的Bitmap      Bitmap bitmap = BitmapFactory.decodeResource(getResources(),              SuperAwesomeCardFragment.getBackgroundBitmapPosition(position));      // Palette的部分      Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {          /**          * 提取完之后的回调方法          */          @Override          public void onGenerated(Palette palette) {              Palette.Swatch vibrant = palette.getVibrantSwatch();              /* 界面颜色UI统一性处理,看起来更Material一些 */              mPagerSlidingTabStrip.setBackgroundColor(vibrant.getRgb());              mPagerSlidingTabStrip.setTextColor(vibrant.getTitleTextColor());              // 其中状态栏、游标、底部导航栏的颜色需要加深一下,也可以不加,具体情况在代码之后说明              mPagerSlidingTabStrip.setIndicatorColor(colorBurn(vibrant.getRgb()));              mToolbar.setBackgroundColor(vibrant.getRgb());              if (android.os.Build.VERSION.SDK_INT >= 21) {                  Window window = getWindow();                  // 很明显,这两货是新API才有的。                  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);  }

最终效果图如下:

你可能感兴趣的文章
什么情况下用+运算符进行字符串连接比调用StringBuilder对象的append方法连接字符串性能更好?
查看>>
怎么根据Comparable方法中的compareTo方法的返回值的正负 判断升序 还是 降序?
查看>>
理解事务的4种隔离级别
查看>>
常用正则匹配符号
查看>>
建议42: 让工具类不可实例化
查看>>
Java 异步机制与同步机制的区别
查看>>
hibernate的对象三种状态说明
查看>>
什么是N+1查询?
查看>>
直插,快排,堆排,归并排序的分析
查看>>
二叉树的各种操作(面试必备)
查看>>
oracle
查看>>
泛型与通配符详解
查看>>
BaseServiceImpl中的实现关键点
查看>>
Struts2中的session、request、respsonse获取方法
查看>>
如何理解MVC模型
查看>>
SpringMVC中乱码解决方案
查看>>
SpringMVC中时间格式转换的解决方案
查看>>
post和get请求相关知识点
查看>>
关于try finally 中的return语句的问题
查看>>
RequestBody/ResponseBody处理Json数据
查看>>