博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android drawable.setAlpha设置无效的解决办法
阅读量:3974 次
发布时间:2019-05-24

本文共 1393 字,大约阅读时间需要 4 分钟。

公司项目有一个需求,图标从网络下载,根据不同的状态设置不同的透明度,于是想当然地这么写:

Drawable drawable = imageView.getDrawable();drawable.setAlpha(alpha);

结果有些图标设置成功了,有些失败。调试发现,成功的都是SquaringDrawable,而失败的都是BitmapDrawable。

进一步调试发现,SquaringDrawable是Glide框架的,BitmapDrawable是系统的。查找资料得知,BitmapDrawable调用setAlpha不是直接调用其自身的Paint,而是通过一个mBitmapState来实现,这个mBitmapState是底层共享的,至于怎么修改,不得而知。不过我们可以通过调用Drawable的mutate()方法来阻断这种共享性,这是BitmapDrawable的mutate()方法源码:

@Override    public Drawable mutate() {        if (!mMutated && super.mutate() == this) {            mBitmapState = new BitmapState(mBitmapState);            mMutated = true;        }        return this;    }

解决方案:

结合Glide代码,我是这么写的:

Glide.with(mContext)                .load(url)                .asBitmap()                .error(R.drawable.ic_app_load)                .placeholder(R.drawable.ic_app_load)                .dontAnimate()                .into(new SimpleTarget
() { @Override public void onResourceReady(Bitmap resource, GlideAnimation
glideAnimation) { BitmapDrawable drawable = new BitmapDrawable(getResources(), resource); drawable.mutate(); imageView.setImageDrawable(drawable); } });

这里,我在源头上指定了imageView的drawable为BitmapDrawable,并调用mutate()方法,而不是由glide自动为我们指定drawable类型。注意,当imageView设置drawable后,再调用mutate()方法阻断已经晚了。

 

 

 

 

转载地址:http://worki.baihongyu.com/

你可能感兴趣的文章
jboss java.lang.NoClassDefFoundError: Could not initialize class com.documentum.fc.client.DfClient
查看>>
芯片常见封装
查看>>
什么是oc门
查看>>
上拉电阻 下拉电阻的汇总
查看>>
NTC热敏电阻的基本特性
查看>>
数字地和模拟地处理的基本原则
查看>>
集电极开路,漏极开路,推挽,上拉电…
查看>>
长尾式差分放大电路2
查看>>
十种精密整流电路
查看>>
红外线遥控原理
查看>>
放大电路的主要性能指标?
查看>>
稳压、调压、监控、DC/DC电路大全
查看>>
放大电路的主要性能指标?
查看>>
运放电压和电流负反馈的讨论
查看>>
运放自激问题
查看>>
运放电压和电流负反馈的讨论
查看>>
终于 整明白了中断的工作原…
查看>>
终于 整明白了中断的工作原…
查看>>
终于 整明白了中断的工作原…
查看>>
终于 整明白了中断的工作原…
查看>>