繁体   English   中英

擦除进度可在圆形进度栏中绘制

[英]Erase progressDrawable in circular progress bar

我创建了一个圆形的进度条,该进度条会随着任务的进行而填充圆圈。 但是,我不想填充,而是要擦除圆圈。 我不知道如何解决这个问题。

这是我的代码:

RingDrawable.java:

public class RingDrawable extends GradientDrawable {

private Class<?> mGradientState;

public RingDrawable() {
    this(Orientation.TOP_BOTTOM, null);
}

public RingDrawable(int innerRadius, int thickness, float innerRadiusRatio, float thicknessRatio) {
    this(Orientation.TOP_BOTTOM, null, innerRadius, thickness, innerRadiusRatio, thicknessRatio);
}

public RingDrawable(GradientDrawable.Orientation orientation, int[] colors) {
    super(orientation, colors);
    setShape(RING);
}

public RingDrawable(GradientDrawable.Orientation orientation, int[] colors, int innerRadius, int thickness, float innerRadiusRatio, float thicknessRatio) {
    this(orientation, colors);
    try {
        setInnerRadius(innerRadius);
        setThickness(thickness);
        setInnerRadiusRatio(innerRadiusRatio);
        setThicknessRatio(thicknessRatio);
    } catch (Exception e) {
        // fail silently - change to your own liking
        e.printStackTrace();
    }
}

public void setInnerRadius(int radius) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    if (mGradientState == null) mGradientState = resolveGradientState();
    Field innerRadius = resolveField(mGradientState, "mInnerRadius");
    innerRadius.setInt(getConstantState(), radius);
}

public void setThickness(int thicknessValue) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    if (mGradientState == null) mGradientState = resolveGradientState();
    Field thickness = resolveField(mGradientState, "mThickness");
    thickness.setInt(getConstantState(), thicknessValue);
}

public void setInnerRadiusRatio(float ratio) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    if (mGradientState == null) mGradientState = resolveGradientState();
    Field innerRadiusRatio = resolveField(mGradientState, "mInnerRadiusRatio");
    innerRadiusRatio.setFloat(getConstantState(), ratio);
}

public void setThicknessRatio(float ratio) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    if (mGradientState == null) mGradientState = resolveGradientState();
    Field thicknessRatio = resolveField(mGradientState, "mThicknessRatio");
    thicknessRatio.setFloat(getConstantState(), ratio);
}

private Class<?> resolveGradientState() {
    Class<?>[] classes = GradientDrawable.class.getDeclaredClasses();
    for (Class<?> singleClass : classes) {
        if (singleClass.getSimpleName().equals("GradientState")) return singleClass;
    }
    throw new RuntimeException("GradientState could not be found in current GradientDrawable implementation");
}

private Field resolveField(Class<?> source, String fieldName) throws SecurityException, NoSuchFieldException {
    Field field = source.getDeclaredField(fieldName);
    field.setAccessible(true);
    return field;
}

}

创建进度条:

    mProgressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal);
    mProgressBar.setMax(duration);
    mProgressBar.setProgress(0);
    mProgressBar.setIndeterminate(false);
    RingDrawable ring = new RingDrawable(25, 5, 0, 0);
    ring.setColor(Color.WHITE);
    mProgressBar.setProgressDrawable(ring);

更新方法:

public void update(long elapsedTime) {
    //update the buttons states
    mProgressBar.setProgress((int)(elapsedTime/1000));
    mProgressBar.invalidate();
}

我发现,通过对圆弧的绘制调用(更改每次更新的角度)来创建自己的可绘制对象,并将其附加到ImageView会更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM