Android自定义观点实现水平带数字百分比进度条

  

这个进度条可以反映真实进度,并且完成百分比的文字时随着进度增加而移动的,所在位置也恰好是真实完成的百分比位置,效果如下:

  

 Android自定义观点实现水平带数字百分比进度条“> <br/>
  </p>
  <p>思路如下:第一部分是左侧的蓝色直线,代表已经完成的进度;第二部分是右侧灰色的直线,代表未完成的进度;第三部分是红色的百分比的数字百分比文本,显示当前确切的完成进度。</p>
  <p>最关键的部分就是要确定百分比文本的确切位置,这里用了油漆的getTextBounds方法,得到文本的宽高,然后再精确确定它的位置。</p>
  <p>视图代码如下:</p>
  
  <pre类=   公开课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自定义观点实现水平带数字百分比进度条