Bootstrap

如何给ProgressBar设置进度标识

给ProgressBar设置进度标识

自定义MyProgress继承ProgressBar,复写

@Override
public synchronized void setProgress(int progress) {
    // TODO Auto-generated method stub
    setText(progress);
    super.setProgress(progress);

}

在setText(int progress)中设置回调

/**
 * 设置文字进度
 * @param progress 当前进度
 */
private void setText(int progress){
    //callBackI 是自定义的一个接口,用于当前进度的回调
    if(callBackI!=null){
        callBackI.onCallBack(progress);
    }
}

然后在回调实现的地方 设置当前的进度数字显示,包括位置和数值

主要是设置位置:通过设置左边距离leftMargin的原理,假设现在布局文件tips位于myProgress左上方,现在只是设置tips的水平左间距,做到上图所示

 
/**
 *
 * @param myProgress 自定义进度条
 * @param tips 显示数字进度的tips
 * @param progress 当前进度
 */
private void setTipsText(MyProgress myProgress,TextView tips,int progress){
    int marginLeftInt=0;//初始化tips的左间距
    if(myProgress.getMax()!=0){
        /*
         * ViewUtil.getViewWidth(tips)自定义的 丈量 view的宽度
         * myProgress的宽度*当前进度的百分比-tips宽度的一半,既是左边的间距,
         * 这样tips就会在当前进度的地方显示,并且以当前进度的地方居中显示
         */
        marginLeftInt=myProgress.getmWidth()*progress/myProgress.getMax()- ViewUtil.getViewWidth(tips)/2;
    }
    tips.setText(String.valueOf(progress));//设置tips的数值
    /*
     *重设tips的左间距 
     */
    ConstraintLayout.LayoutParams lp=( ConstraintLayout.LayoutParams)(tips.getLayoutParams());
    lp.leftMargin=marginLeftInt>=0?marginLeftInt:0;
    tips.setLayoutParams(lp);
}
public class ViewUtil {
    public static int getViewWidth(View view){
        int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        view.measure(widthSpec, heightSpec);
        int measuredWidth = view.getMeasuredWidth();//测量得到的宽
        return measuredWidth;
    }
    public static int getViewHeight(View view){
        int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        view.measure(widthSpec, heightSpec);
        int measuredHeight = view.getMeasuredHeight();//测量得到的高
        return measuredHeight;
    }
}

以下是完整demo的地址,使用的是androidx的ConstraintLayout

androidx.constraintlayout.widget.ConstraintLayout

如果你版本比较低,可以将其改回

android.support.constraint.ConstraintLayout

并将build文件里面dependencies依赖改回ConstraintLayout所需要的依赖版本

如果还不能运行demo,那将demo里的gradle版本改到你的编译器能运行即

demo地址:

https://download.csdn.net/download/t7g367/12488275

;