Android Drawable mutate()& setLevel()

时间:2010-10-30 09:45:42

标签: android progress-bar progress drawable

我正在尝试将drawables存储在静态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;

    }

我错过了什么?

由于

1 个答案:

答案 0 :(得分:2)

看起来您在多个视图中共享相同的Drawable实例。基本上,不要这样做。你为什么要做这个sDrawableMaps缓存而不只是为你需要的每个Drawable调用Resources.getDrawable()?这可能是麻烦的原因。

你使用mutate()也不会按照你的想法做 - 如果Drawable不是已经可变的话,那么这将返回一个新的Drawable实例,然后你可以修改它并且没有人真正看到它。如果它已经是可变的,它确实返回相同的实例,但在这种情况下,没有理由在它上面调用mutate()。