欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现简洁的APP更新dialog数字进度条

程序员文章站 2022-05-07 11:31:50
前言:现在一般的android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新。当有更新时,会弹出一个提示框,点击下载,则在通知...

前言:现在一般的android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新。当有更新时,会弹出一个提示框,点击下载,则在通知来创建一个数字进度条进行下载,下载成功后才到安装界面。

效果: 

 Android实现简洁的APP更新dialog数字进度条

开发环境:androidstudio2.2.1+gradle-2.14.1

涉及知识:

    1.handler机制 

    2.自定义控件+canvas绘画 

    3.自定义dialog 

部分代码: 

public class numberprogressbar extends view {


 /**
  * 右侧未完成进度条的颜色
  */
 private int paintstartcolor = 0xffe5e5e5;

 /**
  * contxt
  */
 private context context;

 /**
  * 主线程传过来进程 0 - 100
  */
 private int progress;

 /**
  * 得到自定义视图的宽度
  */
 private int viewwidth;


 private rectf pieoval;

 private rectf pieovalin;

 /**
  * 得到自定义视图的y轴中心点
  */
 private int viewcentery;

 /**
  * 已完成的画笔
  */
 private paint paintinit = new paint();


 /**
  * 未完成进度条画笔的属性
  */
 private paint paintstart = new paint();

 /**
  * 大圆的画笔
  */
 private paint paintendbig = new paint();

 /**
  * 小圆的画笔
  */
 private paint paintsmall = new paint();


 /**
  * 画中间的百分比文字的画笔
  */
 private paint painttext = new paint();

 /**
  * 要画的文字的宽度
  */
 private int textwidth;

 /**
  * 画文字时底部的坐标
  */
 private float textbottomy;

 private int smallr;//小圆的半径
 private int bigr;//大圆半径
 private float radius;
 private int jr;//气泡矩形

 /**
  * 文字总共移动的长度(即从0%到100%文字左侧移动的长度)
  */
// private int totalmovedlength;
 public numberprogressbar(context context, attributeset attrs) {
  super(context, attrs);
  this.context = context;
  // 构造器中初始化数据
  smallr = dip2px(context, 4);//小圆半径
  bigr = dip2px(context, 8);//大圆半径
  radius = dip2px(context, 10) / 2;//进度条高度
  jr = dip2px(context, 6);//矩形

  initdata();
 }

 /**
  * 初始化数据
  */
 private void initdata() {

  // 未完成进度条画笔的属性
  paintstart.setcolor(paintstartcolor);
  paintstart.setstrokewidth(dip2px(context, 1));
  paintstart.setdither(true);
  paintstart.setantialias(true);
  paintstart.setstyle(paint.style.fill);

  // 已完成进度条画笔的属性
  paintinit.setcolor(context.getresources().getcolor(r.color.blue));
  paintinit.setstrokewidth(dip2px(context, 1));
  paintinit.setantialias(true);
  paintinit.setdither(true);
  paintinit.setstyle(paint.style.fill);


  // 小圆画笔
  paintsmall.setcolor(color.white);
  paintsmall.setantialias(true);
  paintsmall.setstyle(paint.style.fill);

  // 大圆画笔
  paintendbig.setcolor(context.getresources().getcolor(r.color.blue));
  paintendbig.setantialias(true);
  paintendbig.setstyle(paint.style.fill);


  // 百分比文字画笔的属性
  int painttextsizepx = sp2px(context, 11); //设置百分比文字的尺寸
  painttext.setcolor(context.getresources().getcolor(r.color.blue));
  painttext.settextsize(painttextsizepx);
  painttext.setantialias(true);
  painttext.settypeface(typeface.default_bold);

 }

 @override
 protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {
  super.onmeasure(widthmeasurespec, heightmeasurespec);
 }


 @override
 protected void ondraw(canvas canvas) {
  super.ondraw(canvas);

  //得到float型进度
  float progressfloat = progress / 100.0f;
  int viewheight = getmeasuredheight();//得到控件的高度

  viewwidth = getmeasuredwidth() - 4 * jr;

  viewcentery = viewheight - bigr;

  float currentmovedlen = viewwidth * progressfloat + 2 * jr;

  string str = progress + "%";

  rect bounds = new rect();
  painttext.gettextbounds(str, 0, str.length(), bounds);
  textwidth = bounds.width();
  textbottomy = bounds.height();
/**
 * 1:绘画的文本
 * 2.距离x的位移
 * 3.距离y的位移
 * 4.画笔对象
 */
  canvas.drawtext(str, currentmovedlen - textwidth / 2,
    viewcentery - smallr / 2 - bigr / 2 - 2 * jr + textbottomy / 2,
    painttext);//文字


  //圆角矩形初始的
  canvas.drawroundrect(new rectf(2 * jr, viewcentery - radius, currentmovedlen,
      viewcentery + radius),
    radius, radius, paintinit);

  //圆角矩形--进行中
  canvas.drawroundrect(new rectf(currentmovedlen, viewcentery - radius, viewwidth + 2 * jr,
    viewcentery + radius), radius, radius, paintstart);

  pieoval = new rectf(currentmovedlen - bigr, viewcentery - bigr, currentmovedlen + bigr, viewcentery + bigr);

  pieovalin = new rectf(currentmovedlen - smallr, viewcentery - smallr, currentmovedlen + smallr, viewcentery + smallr);

  //大圆
  canvas.drawarc(pieoval, 0, 360, true, paintendbig);

  //小圆
  canvas.drawarc(pieovalin, 0, 360, true, paintsmall);
 }

 /**
  * @param progress 外部传进来的当前进度
  */
 public void setprogress(int progress) {
  this.progress = progress;
  invalidate();
 }

 public static int dip2px(context ctx, float dp) {
  float density = ctx.getresources().getdisplaymetrics().density;
  int px = (int) (dp * density + 0.5f);
  return px;
 }

 public static int sp2px(context context, float spvalue) {
  return (int) typedvalue.applydimension(typedvalue.complex_unit_sp, spvalue, context.getresources().getdisplaymetrics());
 }
}

源码下载:dialog数字进度条

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。