主题颜色提取 ——— Palette

rpse0034 8年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/81e18b7f0ec6642c363482b1c389619b.jpg"></p>    <h3>Palette</h3>    <p>调色板 Palette 是 Android L SDK 中的新特性。可以使用 Palette 从图像中提取出突出的颜色(主色调),获取到颜色之后我们再将这个颜色值赋给 ActionBar、状态栏等。从而达到界面色调的统一,使界面美观协调。</p>    <p>Palette 可以提取图片中如下几种特性的颜色:</p>    <ul>     <li>Vibrant (有活力的)</li>     <li>Vibrant dark(有活力的 暗色调)</li>     <li>Vibrant light(有活力的 明亮)</li>     <li>Muted (柔和的)</li>     <li>Muted dark(柔和的 暗色调)</li>     <li>Muted light(柔和的 明亮)</li>    </ul>    <h3>内部嵌套类</h3>    <ul>     <li>Palette.Builder</li>    </ul>    <p>生成器类,生成 Palette 实例。</p>    <ul>     <li>Palette.Filter</li>    </ul>    <p>过滤器接口,使 Palette 有更加细腻的颜色过滤</p>    <ul>     <li>Palette.PaletteAsyncListener</li>    </ul>    <p>异步加载监听</p>    <ul>     <li>pattle.Swatch</li>    </ul>    <p>提供获取结果的色彩样本</p>    <h3>所有的公共方法</h3>    <table>     <thead>      <tr>       <th>返回值类型</th>       <th>方法及说明</th>      </tr>     </thead>     <tbody>      <tr>       <td>static Palette</td>       <td>from(List<Palette.Switch> switches)<br> 通过预设的 Palette.Swatch 颜色样本列表 来生成 Palette</td>      </tr>      <tr>       <td>static Palette.Builder</td>       <td>from(Bitmap bitmap)<br> 通过返回 Palette.Builder 实例来构建 Palette</td>      </tr>      <tr>       <td>static Palette</td>       <td>generate(Bitmap bitmap,int numColors)<br> 该方法已被遗弃,建议用 Palette.Builder 来生成Palette</td>      </tr>      <tr>       <td>static Palette</td>       <td>generate(Bitmap bitmap)<br> 该方法已被遗弃,建议用 Palette.Builder 来生成Palette</td>      </tr>      <tr>       <td>static AsyncTask<Bitmap,Void,Palette></td>       <td>generateAsync(Bitmap bitmap,int numColor,Palette.PaletteAsyncListener listener)<br> 该方法已被遗弃,建议用 Palette.Builder 来生成Palette</td>      </tr>      <tr>       <td>static AsyncTask<Bitmap,Void,Palette></td>       <td>generateAsync(Bitmap bitmap,Palette.PaletteAsyncListener listener)<br> 该方法已被遗弃,建议用 Palette.Builder 来生成Palette</td>      </tr>      <tr>       <td>int</td>       <td>getColorForTarget(Target target,int defaultColor)<br> 返回一个从目标获取的的 rgb 色值</td>      </tr>      <tr>       <td>int</td>       <td>getDarkMutedColor(int defaultColor)<br> 返回一个柔和的暗色调 rgb 值</td>      </tr>      <tr>       <td>Palette.Swatch</td>       <td>getDarkMutedSwatch()<br> 返回一个柔和的暗色调样本类</td>      </tr>      <tr>       <td>int</td>       <td>getDarkVibrantColor(int defaultColor)<br> 返回一个鲜明的暗色调 rgb 值</td>      </tr>      <tr>       <td>Palette.Swatch</td>       <td>getDarkVibrantSwatch()<br> 返回一个鲜明的暗色调样本类</td>      </tr>      <tr>       <td>int</td>       <td>getDomainColor(int defaultColor)<br> 返回 Palette 中的主色调 rgb值</td>      </tr>      <tr>       <td>Palette.Swatch</td>       <td>getDomainSwatch()<br> 返回一个主色调的样本类</td>      </tr>      <tr>       <td>int</td>       <td>getLightMutedColor(int defaultColor)<br> 返回一个柔和的亮色调颜色 rgb</td>      </tr>      <tr>       <td>Palette.Swatch</td>       <td>getLightMutedSwatch()<br> 返回一个柔和的亮色调样本类</td>      </tr>      <tr>       <td>int</td>       <td>getLightVibrantColor(int defaultColor)<br> 返回一个鲜明的亮色调 rgb</td>      </tr>      <tr>       <td>Palette.Swatch</td>       <td>getLightVibrantSwatch()<br> 返回一个鲜明的亮色调样本类</td>      </tr>      <tr>       <td>int</td>       <td>getMutedColor(int defaultColor)<br> 返回一个柔和的颜色 rgb</td>      </tr>      <tr>       <td>Palette.Swatch</td>       <td>getMutedSwatch()<br> 返回一个柔和的颜色样本类</td>      </tr>      <tr>       <td>Palette.Swatch</td>       <td>getSwatchForTarget(Target target)<br> 为给定的目标从 Palette 中返回一个选中样本,如果未找到则返回空</td>      </tr>      <tr>       <td>List<Palette.Swatch></td>       <td>getSwatches()<br> 获取所有用在Palette中的Swatch样本类</td>      </tr>      <tr>       <td>List<Target></td>       <td>getTargets()<br> 获取所有构造 Palette 的 Target</td>      </tr>      <tr>       <td>int</td>       <td>getVibrantColor(int defaultColor)<br> 获取一个鲜明的颜色 rgb</td>      </tr>      <tr>       <td>Palette.Swatch</td>       <td>getVibrantSwatch()<br> 获取一个鲜明的样本类</td>      </tr>     </tbody>    </table>    <h3>使用方式</h3>    <p>使用 Palette 需先引入 Palette 的 support 资源包:</p>    <pre>  <code class="language-java">compile 'com.android.support:palette-v7:25.1.0'   </code></pre>    <p>加载不能在主线程中进行,加载方式有同步加载和异步加载两种:</p>    <ul>     <li>同步</li>    </ul>    <pre>  <code class="language-java">//在加载图片的后台线程中同步加载Palette palette = Palette.from(bitmap).genrate();   .   .   .    </code></pre>    <ul>     <li>异步</li>    </ul>    <pre>  <code class="language-java">//异步加载Palette.from(bitmap).genrate(new PaletteAsyncListener(){  public void onGenerated(Palette p){         .         .         .     }   });    </code></pre>    <h3>具体使用代码</h3>    <p>这里使用 MvpDemo 中的部分代码,跟 Glide 配合起来使用的,其他辅助类代码直接 Demo 中查看。</p>    <pre>  <code class="language-java">//这是 Glide 加载状态的监听回调@Overridepublic boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target,boolean isFromMemoryCache, boolean isFirstResource) {  //获取到 Glide 加载图片的 Bitmap     final Bitmap bitmap = GlideUtils.getBitmap(resource);  //获取到24dp的长度     final int twentyFourDip = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,                  24, ZhihuStoryInfoActivity.this.getResources().getDisplayMetrics());  assert bitmap != null;     Palette.from(bitmap)          //设置构建 Palette 时使用的最大颜色数,风景景观推荐值在10-16,人脸图像色值增加到24             .maximumColorCount(3)             .clearFilters()             .setRegion(0, 0, bitmap.getWidth() - 1, twentyFourDip)             .generate(new Palette.PaletteAsyncListener() {              @Override                 public void onGenerated(Palette palette) {                  boolean isDark;                  int lightness = ColorUtils.isDark(palette);                  if (lightness == ColorUtils.LIGHTNESS_UNKNOWN) {                         isDark = ColorUtils.isDark(bitmap, bitmap.getWidth() / 2, 0);                     } else {                         isDark = lightness == ColorUtils.IS_DARK;                     }                  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {                      int statusBarColor = getWindow().getStatusBarColor();                      final Palette.Swatch topColor = ColorUtils.getMostPopulousSwatch(palette);                      if (topColor != null && (isDark || Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)) {                             statusBarColor = ColorUtils.scrimify(topColor.getRgb(), isDark, SCRIM_ADJUSTMENT);                          if (!isDark && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                                 ViewUtils.setLightStatusBar(mStoryImg);                             }                         }                      if (statusBarColor != getWindow().getStatusBarColor()) {                             ValueAnimator statusBarColorAnim = ValueAnimator.ofArgb(                                     getWindow().getStatusBarColor(), statusBarColor);                             statusBarColorAnim                                 .addUpdateListener(new ValueAnimator                                 .AnimatorUpdateListener() {                                  @Override                                     public void onAnimationUpdate(ValueAnimator animation) {                                         getWindow().setStatusBarColor((int) animation.getAnimatedValue());                                     }                                 });                                  //设置转换颜色的动画时间                                     statusBarColorAnim.setDuration(1000L);                                     statusBarColorAnim.setInterpolator(                                          new AccelerateInterpolator());                                     statusBarColorAnim.start();                         }                     }                 }             });   }   </code></pre>    <p> </p>    <p>来自:http://mobile.51cto.com/android-532234.htm</p>    <p> </p>