我正在制作应用程序只是为了查看一些新的L API,我对FloatingActionButton
和Palette颜色生成器特别感兴趣。所以我设置一个全屏ImageView
来显示HTC壁纸,然后我用Palette
提取其中一种颜色并将其设置为我的FAB的背景颜色。但是,这样做会从我的FAB中删除Outline,因此它不再是循环的
我想知道如果可能的话,如何阻止调色板覆盖大纲。
Palette AsyncListener:
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());
}
}
});
int size = getResources().getDimensionPixelSize(R.dimen.fab_size);
Outline outline = new Outline();
outline.setOval(0, 0, size, size);
findViewById(R.id.fab).setOutline(outline);
<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>
答案 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()来更新视图。