美文网首页
Drawable的mutate方法——多ImageView.se

Drawable的mutate方法——多ImageView.se

作者: zizi192 | 来源:发表于2017-11-08 18:20 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/gumymxtx.html