我试图将可绘制对象存储在静态SoftReferenceMap中,以便在每行中包含进度条的ListView。每行都有不同的进度,但是当我通过setProgress(int)对其进行设置时,所有行都会受到影响。
我尝试做mDrawable.mutate()。setLevel(progress * 10000 / max),但仍然无法正常工作。
public void setProgres(int status, int progress, int max) {
Drawable d = getDrawable(status);
switch (status) {
case RED_INDETERMINATE:
setIndeterminateDrawable(d);
setIndeterminate(true);
break;
case YELLOW:
d.mutate().setLevel((int) (progress * 10000 / max));
case GREEN:
case BLUE:
setProgressDrawable(d);
break;
default:
throw new IllegalArgumentException(
"Invalid Status setting for ArtooProgressBar: " + status);
}
getProgressDrawable().invalidateSelf();
super.invalidate();
}
private Drawable getDrawable(int status) {
SoftReference<Drawable> ref = sDrawableMaps.get("" + status);
if (ref != null && ref.get() != null)
return ref.get();
Drawable d;
switch (status) {
case RED_INDETERMINATE:
d = getResources().getDrawable(
R.drawable.progress_bar_indeterminate);
d = tileifyIndeterminate(d);
break;
case YELLOW:
// d = yellow;
d = getResources().getDrawable(
R.drawable.progress_bar_determinate_yellow);
break;
case GREEN:
d = getResources().getDrawable(
R.drawable.progress_bar_determinate_green);
d.setLevel(10000);
break;
case BLUE:
d = getResources().getDrawable(
R.drawable.progress_bar_determinate_blue);
d.setLevel(10000);
break;
default:
throw new IllegalArgumentException(
"Invalid Status setting for ArtooProgressBar: " + status);
}
if (d != null)
sDrawableMaps.put("" + status, new SoftReference<Drawable>(d));
d.invalidateSelf();
return d;
}
我想念什么?
谢谢
最佳答案
看来您正在多个视图中共享同一个Drawable实例。基本上,不要那样做。为什么要执行此sDrawableMaps缓存操作,而不是仅为所需的每个Drawable调用Resources.getDrawable()?这可能是造成麻烦的原因。
同样,您对mutate()的使用也不会按照您的想法进行操作-如果Drawable尚未可变,那么它将返回一个新的Drawable实例,您可以对其进行修改,但实际上没有人看到。如果它已经可变,它会返回相同的实例,但是在这种情况下,没有理由在其上调用mutate()。
关于android - Android Drawable mutate()和setLevel(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4058099/