Drawable的mutate方法——多ImageView.setAlpha失效问题解决

项目中有这样一个场景,不同界面的多个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即可。

参考文章:
android Drawable.mutate()的使用

你可能感兴趣的:(Drawable的mutate方法——多ImageView.setAlpha失效问题解决)