这个进度条可以反映真实进度,并且完成百分比的文字时随着进度增加而移动的,所在位置也恰好是真实完成的百分比位置,效果如下:
公开课NumberProgressView扩展视图{/* * *进度条画笔的宽度(dp) */私人int paintProgressWidth=3;/* * *文字百分比的字体大小(sp) */私人int paintTextSize=20;/* * *左侧已完成进度条的颜色 */私人int paintLeftColor=0 xff67aae4;/* * *右侧未完成进度条的颜色 */私人int paintRightColor=0 xffaaaaaa;/* * *百分比文字的颜色 */私人int paintTextColor=0 xffff0077;/* * * Contxt */私人上下文语境;/* * *主线程传过来进程0 - 100 */私人int进展;/* * *得到自定义视图的宽度 */私人int viewWidth;/* * *得到自定义视图的Y轴中心点 */私人int viewCenterY;/* * *画左边已完成进度条的画笔 */私人涂paintleft=new ();/* * *画右边未完成进度条的画笔 */私人涂paintRight=new ();/* * *画中间的百分比文字的画笔 */私人涂paintText=new ();/* * *要画的文字的宽度 */私人int textWidth;/* * *画文字时底部的坐标 */私人textBottomY浮动;/* * *包裹文字的矩形 */私人矩形矩形=new矩形();/* * *文字总共移动的长度(即从0%到100%的文字左侧移动的长度) */私人int totalMovedLength; 公共NumberProgressView(上下文语境,AttributeSet attrs) { 超级(上下文,attrs); 这一点。上下文=上下文;//构造器中初始化数据 initData (); }/* * *初始化数据 */私人空间initData () {//设置进度条画笔的宽度 int paintProgressWidthPx=跑龙套。dip2px(上下文,paintProgressWidth);//设置百分比文字的尺寸 int paintTextSizePx=跑龙套。sp2px(上下文,paintTextSize);//已完成进度条画笔的属性 paintleft.setColor (paintLeftColor); paintleft.setStrokeWidth (paintProgressWidthPx); paintleft.setAntiAlias(真正的); paintleft.setStyle (Style.FILL);//未完成进度条画笔的属性 paintRight.setColor (paintRightColor); paintRight.setStrokeWidth (paintProgressWidthPx); paintRight.setAntiAlias(真正的); paintRight.setStyle (Style.FILL);//百分比文字画笔的属性 paintText.setColor (paintTextColor); paintText.setTextSize (paintTextSizePx); paintText.setAntiAlias(真正的); paintText.setTypeface (Typeface.DEFAULT_BOLD); } @Override 保护空白> 公开课NumberProgressBarActivity延伸活动{ 保护静态最终int WHAT_INCREASE=1; 私人NumberProgressView np_numberProgressBar; 私人int进展; 私人处理程序处理程序=new处理程序(){ 公共空间handleMessage (android.os。消息味精){ 进步+ +; np_numberProgressBar.setProgress(进步); 处理程序。sendEmptyMessageDelayed (WHAT_INCREASE getRadomNumber (200); 如果(进步祝辞=100){ handler.removeMessages (WHAT_INCREASE); } } }; @Override 保护空白>/* * *将下降或dp值转换为像素值,保证尺寸大小不变 */公共静态int dip2px(上下文背景下,浮动dipValue) { 最后的浮动比例=context.getResources () .getDisplayMetrics () .density; 返回(int) (dipValue *规模+ 0.5 f); }/* * *将sp值转换为像素值,保证文字大小不变 */公共静态int sp2px(上下文背景下,浮动spValue) { 最后浮动fontScale=context.getResources () .getDisplayMetrics () .scaledDensity; 返回(int) (spValue * fontScale + 0.5 f); }
布局:
& lt; LinearLayout xmlns: android=" http://schemas.android.com/apk/res/android " android: layout_width=" match_parent " android: layout_height=" match_parent " 面向android:=按怪薄北? & lt; com.example.viewdemo.view.NumberProgressView android: id=癅 + id/np_numberProgressBar” android: layout_width=" wrap_content " android: layout_height=" 100 dp” android: layout_margin=" 20 dp” android:背景=" # 33890075 "/比; & lt;按钮 android: id=癅 + id/btn_numberProgressBar” android: layout_width=" match_parent " android: layout_height=" wrap_content " android:文本="开始”/比; & lt;/LinearLayout>Android自定义观点实现水平带数字百分比进度条