Drawable的mutate方法——多ImageView.se
2017-11-08 本文已影响0人
zizi192
项目中有这样一个场景,不同界面的多个ImageView,展示同一个drawable资源,但是页面根据自身的scroll位置不同,设置了不同的alpha值。
初始代码如下:
imageView.setImageResource(resId);
imageView.setAlpha(alpha);
在实际测试中发现,多个页面加载同一Drawable的不同ImageView的表现一致,即均展示了统一的alpha(最后一次调用设置的alpha值)的效果。
原因是默认情况下,同一资源id加载的所有Drawable实例,共享同一状态。Drawable可使用mutate方法来解决上述问题。该方法说明如下。
/**
* Make this drawable mutable. This operation cannot be reversed. A mutable
* drawable is guaranteed to not share its state with any other drawable.
* This is especially useful when you need to modify properties of drawables
* loaded from resources. By default, all drawables instances loaded from
* the same resource share a common state; if you modify the state of one
* instance, all the other instances will receive the same modification.
*
* Calling this method on a mutable Drawable will have no effect.
*
* @return This drawable.
* @see ConstantState
* @see #getConstantState()
*/
public Drawable mutate() {
return this;
}
mutate方法让drawable可变的,保证了与其他drawable的状态隔离,该操作不可逆。解决方案如下:
Drawable drawable = getResources().getDrawable(resId);
imageView.setImageDrawable(drawable.mutate());
imageView.getDrawable().setAlpha(255*alpha);
在尝试上述解决方案时,最初imageView一直未能未显示图片。原来是xml中设置了alpha属性为0,即imageView全透明。删除改行,动态设置alpha即可。