首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Drawable mutate() & setLevel()

Android Drawable mutate() & setLevel()
EN

Stack Overflow用户
提问于 2010-10-30 17:45:42
回答 1查看 3.6K关注 0票数 1

我正在尝试为每一行都包含进度条的ListView将可绘制内容存储在静态SoftReferenceMap中。每一行都有不同的进度,但是当我通过setProgress(int)设置它时,所有的行都会受到影响。

我试过做mDrawable.mutate().setLevel(progress*10000/max),,但它仍然不起作用。

代码语言:javascript
复制
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;

    }

我遗漏了什么?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2010-10-31 04:14:27

看起来您正在多个视图之间共享相同的可绘制实例。基本上,不要这样做。为什么要做这种sDrawableMaps缓存的事情,而不是只为需要的每个可绘制文件调用Resources.getDrawable()?这很可能是造成麻烦的原因。

此外,您使用mutate()也不会像您所想的那样--如果可绘制的内容还不是可变的,那么它将返回一个新的可绘制的实例,然后修改该实例,实际上没有人会看到该实例。如果它已经是可变的,它会返回相同的实例,但在这种情况下,没有理由在它上调用mutate()。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4058099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档