调色板颜色覆盖大纲

时间:2014-09-20 14:44:44

标签: android android-5.0-lollipop

我正在制作应用程序只是为了查看一些新的L API,我对FloatingActionButton和Palette颜色生成器特别感兴趣。所以我设置一个全屏ImageView来显示HTC壁纸,然后我用Palette提取其中一种颜色并将其设置为我的FAB的背景颜色。但是,这样做会从我的FAB中删除Outline,因此它不再是循环的 我想知道如果可能的话,如何阻止调色板覆盖大纲。

Palette AsyncListener:

MyActivity.java

Palette.generateAsync(BitmapFactory.decodeResource(getResources(),R.drawable.wallpapers_07),
     new Palette.PaletteAsyncListener() {
          @Override
          public void onGenerated(Palette palette) {
              PaletteItem item = palette.getLightVibrantColor();
              ImageButton button = (ImageButton) findViewById(R.id.fab);
              if (item != null) {
                  button.setBackgroundColor(item.getRgb());
              }
           }
     });

MyActivity.java中的大纲

int size = getResources().getDimensionPixelSize(R.dimen.fab_size);
Outline outline = new Outline();
outline.setOval(0, 0, size, size);
findViewById(R.id.fab).setOutline(outline);

FAB背景可绘制

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:colorControlHighlight">
<item>
    <shape android:shape="oval">
        <solid android:color="?android:colorAccent"/>
    </shape>
</item>

1 个答案:

答案 0 :(得分:2)

您正在用颜色(ColorDrawable)替换背景drawable(RippleDrawable)。相反,您想要更改背景drawable所包含的形状(GradientDrawable)的颜色。

请尝试更改颜色过滤器:

findViewById(R.id.fab).getBackgroundDrawable().setColorFilter(
    new PorterDuffColorFilter(item.getRgb(), Mode.SRC_IN));

如果您经常更改颜色,可以只缓存颜色过滤器对象并使用setColor(int),然后使用findViewById(R.id.fab).invalidate()来更新视图。