如何重写 ProgressBar 以将进度填充更改为具有圆角和颜色的可绘制对象

3
我有一个特定的颜色是通过编程创建的。
我在GradientDrawable中使用该颜色。
为了使进度条使用该GradientDrawable来创建进度填充颜色,我需要重写ProgressBar源代码的某些部分,但我不知道应该重写哪部分以及将代码放在哪里。
这是进度条源代码:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/ProgressBar.java

这是我想要使用的可绘制对象,但它不能根据进度进行扩展。
public static GradientDrawable progressBarProgressDrawable(Context context, float[] radii) {
    GradientDrawable shape = new GradientDrawable();
    shape.setCornerRadii(radii);
    shape.setColor(context.getResources().getColor(R.color.green_button));

    float brightness = 0.9f;
    float[] hsb = new float[] { 43, 23, (33 * brightness) };
    int alpha = 77;
    int newColor = Color.HSVToColor(alpha, hsb);
    shape.setColor(newColor);

    return shape;
}

你是为了改变颜色而覆盖ProgressBar吗?其实有更简单的方法。请看这里:http://www.tiemenschut.com/how-to-customize-android-progress-bars/ - mykolaj
查看此处和此处。 - MysticMagicϡ
@pskink,在这种情况下我应该使用哪种PorterDuff模式? - Kaloyan Roussev
getProgressDrawable 返回 null :( - Kaloyan Roussev
Drawable shape = sbGoalProfile.getProgressDrawable(); Log.d("asd", String.valueOf(shape)); shape.setColorFilter(a.getResources().getColor(R.color.green_button), PorterDuff.Mode.SRC_ATOP ); - Kaloyan Roussev
显示剩余2条评论
2个回答

1

try this:

    final ProgressBar pb = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
    setContentView(pb);

    GradientDrawable gd = new GradientDrawable();
    gd.setCornerRadius(32);
    final Drawable cd = new ClipDrawable(gd, Gravity.LEFT, ClipDrawable.HORIZONTAL);
    pb.setProgressDrawable(cd);

    OnTouchListener l = new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int progress = (int) (event.getX() * pb.getMax() / pb.getWidth());
            pb.setProgress(progress);
            float[] hsv = {
                    event.getX() * 360 / pb.getWidth(), 1, 1
            };
            int color = Color.HSVToColor(hsv);
            Log.d(TAG, "onTouch " + Integer.toHexString(color));
            cd.setColorFilter(color, Mode.SRC_ATOP);
            return true;
        }
    };
    pb.setOnTouchListener(l);

0

ProgressBar有一个方法setBackgroundColor(int color)

如果你想要覆盖它,你可以

@Override
public void setBackgroundColor (int color) {
    int c = 0x0000ff00; // Using green
    super.setBackgroundColor(c);
}

或者你可以直接调用

ProgressBar bar = new ProgressBar();
bar.setBackgroundColor(c);

我想要改变进度条的填充颜色,而不是背景颜色。 - Kaloyan Roussev
另外,我想设置一个具有圆角的自定义可绘制对象。 - Kaloyan Roussev
1
查看在 XML 资源文件中定义的默认进度可绘制对象。 - pskink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接