前言:现在一般的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小时内与您取得联系。