全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

效果: 

 

开发环境: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数字进度条

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


# Android  # APP  # dialog  # 进度条  # Android实现APP在线下载更新  # 基于Retrofit2+RxJava2实现Android App自动更新  # android中强制更新app实例代码  # Android应用App更新实例详解  # Android应用APP自动更新功能的代码实现  # Android App增量更新详解及实例代码  # Android如何实现APP自动更新  # Android App实现应用内部自动更新的最基本方法示例  # android实现通知栏下载更新app示例  # Android实现APP自动更新功能  # 小圆  # 自定义  # 未完成  # 都是  # 圆角  # 中心点  # 当你  # 你有  # 弹出  # 点击下载  # 它会  # 则在  # 新版本  # 创建一个  # 不断更新  # 大家多多  # 源码下载  # 才到  # 进行下载 


相关文章: 建站之星导航如何优化提升用户体验?  音响网站制作视频教程,隆霸音响官方网站?  建站主机数据库如何配置才能提升网站性能?  PHP 500报错的快速解决方法  如何在建站宝盒中设置产品搜索功能?  盐城做公司网站,江苏电子版退休证办理流程?  公司门户网站制作流程,华为官网怎么做?  Python lxml的etree和ElementTree有什么区别  如何选择建站程序?包含哪些必备功能与类型?  如何在橙子建站上传落地页?操作指南详解  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  建站主机选购指南:核心配置与性价比推荐解析  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  Bpmn 2.0的XML文件怎么画流程图  XML的“混合内容”是什么 怎么用DTD或XSD定义  建站主机是否属于云主机类型?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  建站主机如何安装配置?新手必看操作指南  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  太平洋网站制作公司,网络用语太平洋是什么意思?  如何获取免费开源的自助建站系统源码?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  Swift开发中switch语句值绑定模式  再谈Python中的字符串与字符编码(推荐)  太原网站制作公司有哪些,网约车营运证查询官网?  建站之星后台密码遗忘如何找回?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  建站之星上传入口如何快速找到?  宝塔建站无法访问?如何排查配置与端口问题?  广州美橙建站如何快速搭建多端合一网站?  Swift中switch语句区间和元组模式匹配  如何通过VPS搭建网站快速盈利?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何用景安虚拟主机手机版绑定域名建站?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何在阿里云通过域名搭建网站?  C++如何编写函数模板?(泛型编程入门)  建站主机与虚拟主机有何区别?如何选择最优方案?  定制建站流程解析:需求评估与SEO优化功能开发指南  招商网站制作流程,网站招商广告语?  建站OpenVZ教程与优化策略:配置指南与性能提升  大连网站设计制作招聘信息,大连投诉网站有哪些?  C#如何序列化对象为XML XmlSerializer用法  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。