android drawable.setAlpha设置无效的解决办法
程序员文章站
2024-03-24 08:33:04
...
公司项目有一个需求,图标从网络下载,根据不同的状态设置不同的透明度,于是想当然地这么写:
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<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
BitmapDrawable drawable = new BitmapDrawable(getResources(), resource);
drawable.mutate();
imageView.setImageDrawable(drawable);
}
});
这里,我在源头上指定了imageView的drawable为BitmapDrawable,并调用mutate()方法,而不是由glide自动为我们指定drawable类型。注意,当imageView设置drawable后,再调用mutate()方法阻断已经晚了。
上一篇: 原生JS透明度动画案例
推荐阅读
-
android 各种控件颜色值的设置(使用Drawable,Color)
-
Android关于overdraw过度绘制问题的解决办法getWindow().setBackgroundDrawable(null);
-
Android关于overdraw过度绘制问题的解决办法getWindow().setBackgroundDrawable(null);
-
Android中传送序列化对象出现的ClassNotFoundException解决办法 博客分类: Android AndroidClassNotFoundException序列化
-
Android shape中的padding无效 博客分类: Android
-
Android shape中的padding无效 博客分类: Android
-
android sdk manager 的解决办法 博客分类: 工具使用 android
-
android:TextView简单设置文本样式和超链接的方法
-
Android TextView使用SpannableString设置复合文本的方法详解
-
Android在view.requestFocus(0)返回false的解决办法