前言:现在一般的Android软件都是需要不断更新的,当你打开某个应用的时候,如果有新的版本,它会提示你有新版本需要更新。当有更新时,会弹出一个提示框,点击下载,则在通知来创建一个数字进度条进行下载,下载成功后才到安装界面。
<>强效果:,强>
,
<强>开发环境:强> AndroidStudio2.2.1 + gradle-2.14.1
<强>涉及知识:强>
1.处理程序机制,
2。自定义控件+帆布绘画,
3。自定义dialog
<强>部分代码:强>,
公开课NumberProgressBar扩展视图{/* * *右侧未完成进度条的颜色 */私人int paintStartColor=0 xffe5e5e5;/* * * Contxt */私人上下文语境;/* * *主线程传过来进程0 - 100 */私人int进展;/* * *得到自定义视图的宽度 */私人int viewWidth; 私人RectF pieOval; 私人RectF pieOvalIn;/* * *得到自定义视图的Y轴中心点 */私人int viewCenterY;/* * *已完成的画笔 */私人涂paintInit=new ();/* * *未完成进度条画笔的属性 */私人涂paintStart=new ();/* * *大圆的画笔 */私人涂paintEndBig=new ();/* * *小圆的画笔 */私人涂paintSmall=new ();/* * *画中间的百分比文字的画笔 */私人涂paintText=new ();/* * *要画的文字的宽度 */私人int textWidth;/* * *画文字时底部的坐标 */私人textBottomY浮动; 私人int smallR;//小圆的半径 私人int bigR;//大圆半径 私人浮动半径; 私人小int;//气泡矩形/* * *文字总共移动的长度(即从0%到100%的文字左侧移动的长度) *///私人int totalMovedLength; 公共NumberProgressBar(上下文语境,AttributeSet attrs) { 超级(上下文,attrs); 这一点。上下文=上下文;//构造器中初始化数据 smallR=dip2px(上下文,4);//小圆半径 bigR=dip2px(上下文,8);//大圆半径 半径=dip2px(上下文,10)/2;//进度条高度 ?dip2px(上下文,6);//矩形 initData (); }/* * *初始化数据 */私人空间initData () {//未完成进度条画笔的属性 paintStart.setColor (paintStartColor); paintStart。setStrokeWidth (dip2px(上下文,1)); paintStart.setDither(真正的); paintStart.setAntiAlias(真正的); paintStart.setStyle (Paint.Style.FILL);//已完成进度条画笔的属性 paintInit.setColor (context.getResources () .getColor (R.color.blue)); paintInit。setStrokeWidth (dip2px(上下文,1)); paintInit.setAntiAlias(真正的); paintInit.setDither(真正的); paintInit.setStyle (Paint.Style.FILL);//小圆画笔 paintSmall.setColor (Color.WHITE); paintSmall.setAntiAlias(真正的); paintSmall.setStyle (Paint.Style.FILL);//大圆画笔 paintEndBig.setColor (context.getResources () .getColor (R.color.blue)); paintEndBig.setAntiAlias(真正的); paintEndBig.setStyle (Paint.Style.FILL);//百分比文字画笔的属性 int paintTextSizePx=sp2px(上下文,11);//设置百分比文字的尺寸 paintText.setColor (context.getResources () .getColor (R.color.blue)); paintText.setTextSize (paintTextSizePx); paintText.setAntiAlias(真正的); paintText.setTypeface (Typeface.DEFAULT_BOLD); } @Override 保护无效onMeasure (int widthMeasureSpec int heightMeasureSpec) { 超级。onMeasure (widthMeasureSpec heightMeasureSpec); } @Override 保护无效onDraw(帆布画布){ super.onDraw(画布);//得到浮动型进度 浮动progressFloat=f/100.0进展; int viewHeight=getMeasuredHeight();//得到控件的高度 viewWidth=getMeasuredWidth() - 4 *小; viewCenterY=viewHeight - bigR; 浮动currentMovedLen=viewWidth * progressFloat + 2 *小; 字符串str=进步+“%”; 矩形边界=new矩形(); paintText。getTextBounds (str 0 str.length(),范围); textWidth=bounds.width (); textBottomY=bounds.height ();/* * * 1:绘画的文本 * 2 .距离x的位移 * 3 .距离Y的位移 * 4 .画笔对象 */画布。drawText (str currentMovedLen - textWidth/2, viewCenterY - smallR/2 - bigR/2 - 2 *小+ textBottomY/2, paintText);//文字//圆角矩形初始的 画布。drawRoundRect(新RectF(2 *小,viewCenterY半径,currentMovedLen, viewCenterY +半径) 半径,半径,paintInit);//圆角矩形——进行中 画布。drawRoundRect(新RectF (currentMovedLen viewCenterY半径,viewWidth + 2 *小, viewCenterY +半径),半径,半径,paintStart); pieOval=new RectF (currentMovedLen——bigR viewCenterY——bigR currentMovedLen + bigR viewCenterY + bigR); pieOvalIn=new RectF (currentMovedLen——smallR viewCenterY——smallR currentMovedLen + smallR viewCenterY + smallR);//大圆 画布。drawArc (pieOval 0 360,真的,paintEndBig);//小圆 画布。drawArc (pieOvalIn 0 360,真的,paintSmall); }/* * * @param进步外部传进来的当前进度 */公共空间setProgress (int进展){ 这一点。进步=进步; 无效(); } 公共静态int dip2px(上下文ctx,浮动dp) { .density .getDisplayMetrics漂浮密度=ctx.getResources () (); int px=(int) + 0.5 (dp *密度f); 返回px; } 公共静态int sp2px(上下文背景下,浮动spValue) { 返回(int) TypedValue.applyDimension (TypedValue。.getDisplayMetrics COMPLEX_UNIT_SP、spValue context.getResources () ()); } }Android实现简洁的应用更新对话框数字进度条