调用View的getBackground()获取Drawable

2020-09-14  本文已影响0人  zgq简书

大多数APP应该都有滑动列表时,顶部的标题的背景颜色,随着滑动距离来改变透明度,如下

1、改变背景颜色透明度

mLayoutTitle.getBackground().setAlpha(alpha); //(alpha:0 - 255)

2、获取alpha的值(0 - 255)

先设定一个滑动的最大高度maxHeight,通过recyclrview、NestedScrollView等可以获取到当前滑动的高度currHeight,下面就是计算alpha的具体值

float scale = (float)currHeight / maxHeight; // 不能使用int类型

int alpha = (int) (255 * scale);// 最终设置给setAlpha的透明度

这个时候美滋滋的调用mLayoutTitle.getBackground().setAlpha(alpha); 运行代码,滑动测试,没毛病,可以的,完美~~~哎,一不小心进入了一个页面,这个页面使用的颜色和标题的背景色一样,发现也变成透明色了,这尼玛什么鬼

这个时候找google了,大概是这样说的:默认情况下,所有的从同一资源加载来的drawable实例都共享一个共用的状态,如果你更改一个实例的状态,其他所有的实例都会收到相同的通知,并随之改变。好吧,你赢了!!!

解决方案1:换一种实现方式

参数1:透明度、参数2、3、4,是要显示的色值

mLayoutTitle.setBackgroundColor(Color.argb(alpha, 255, 255, 255));

解决方案2:我就要用那种方式实现,咋整!!!一顿操作还是有方法的mutate(),具体实现如下

mLayoutTitle.getBackground().mutate().setAlpha(alpha);

之前都用的方案1,没用过方案2,这次心血来潮试一次,结果出现.......。总算是解决了

上一篇下一篇

猜你喜欢

热点阅读