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

软件编程 Android 分类:[default] 更新日期: 2017-04-07
这篇文章主要为大家详细介绍了Android实现简洁的APP更新dialog数字进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言:现在一般的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数字进度条

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


> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!

相关文章
  • Jquery和BigFileUpload实现大文件上传及进度条显示
    Jquery和BigFileUpload实现大文件上传及进度条显示
    这篇文章主要介绍了Jquery和BigFileUpload实现大文件上传及进度条显示的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下实现方法:用到了高山来客 的bigfileupload组件,用高山来客的方法,弹出一个模式窗口,然后不停刷新获取进度,始终觉得体验感不好,于是想到用jquery来实现无刷新进度显示,因为提交页面后, 不能让其刷新页面 ...
  • Flex中对表格某列的值进行数字格式化并求百分比添加%
    Flex中对表格某列的值进行数字格式化并求百分比添加%
    需要对表格中某列的数值进行格式化,对该数值乘以100,并保留两位小数,添加"%"下面同实例来实现下1.问题背景 一般的,需要对表格中某列的数值进行格式化,对该数值乘以100,并保留两位小数,添加"%" 2.实现实例 <?xml version="1.0" encoding="utf- ...
  • 解读ASP.NET5&MVC6系列教程1:ASP.NET5简介
    这篇文章主要介绍ASP.NET 5简介以及对各个版本号进行解释,ASP.NET 5中新的变化,需要的朋友可以参考下.ASP.NET 5简介 ASP.NET 5是一个跨时代的改写,所有的功能和模块都进行了独立拆分,做到了彻底解耦.为了这些改写,微软也是蛮 拼的,几乎把.NET Framwrok全部改写了一遍,形成了一个.NET Core的东西. 在.NET C ...
  • HTML5实战与剖析之触摸事件(touchstart、touchmove和touchend)
    本文主要介绍HTML5实战与剖析之触摸事件,介绍的比较详细,需要的朋友可以参考下. HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主要是触摸事件:touchstart.touchmove和touchend. ...
  • Swift中内置的集合类型学习笔记
    Swift中内置的集合类型学习笔记
    Swift中自带数组.set.字典三大集合类型,这里将学习过程中的基础的Swift中内置的集合类型学习笔记进行整理,需要的朋友可以参考下一.引言 Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型.Array用于存放一组有序的数据,数据角标从0开始一次递增:Set用于存放一组无序的数据,数据不可以重复:Dicti ...
  • PHP微信开发之文本自动回复
    PHP微信开发之文本自动回复
    这篇文章主要为大家详细介绍了PHP微信开发之简单实现文本自动回复的相关资料,感兴趣的小伙伴们可以参考一下首先,先去微信公众平台注册一个账号(注册要填的东西挺多的),注册好之后,登录进去.可以看到左侧的"开发者中心",开启开发者中心前好像还要你完善一些资料,按照步骤完善即可.进入开发者中心之后,先去编辑 修改配置,修改配置的时候,注意: U ...
猜你喜欢