技术标签: Android开发弹框横向进度条
Android实现简洁的APP更新dialog数字进度条
发布时间:2020-09-17 20:54:59
来源:脚本之家
阅读:92
作者:曦笑大海
前言:现在一般的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数字进度条
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。
文章浏览阅读1.5k次,点赞13次,收藏17次。最近在训练Yolov8-Pose时遇到一个问题,就是如何将自己使用labelme标注的Json文件转化成可用于Yolov8-Pose训练的txt文件。_labelme骨骼点json转yolo
文章浏览阅读680次,点赞2次,收藏8次。安装mysql5.7_linux mysql 5.7
文章浏览阅读611次。北京大学国球联赛是北大师生均可参加的全校范围的乒乓球团体赛事,于5月的每周五晚上在邱德拔乒乓球厅分轮次举办。信科师生有着优秀的国球文化氛围。继今年4月夺得北大杯和硕博杯双冠后,信科师生乒乓球队5月再次出征2021年北京大学国球联赛,并最终成功卫冕,在本学期内豪取三连冠。方藤(中)与黄子蔚(右)正在对刘力锋教授(左)进行局间场外指导小组赛中,信科的对手有叉院城环联队、乒协联队等强强联合的劲敌。在连续..._北大蔡华谦
文章浏览阅读395次,点赞5次,收藏8次。解析:这个题他给了很多方法,但是我还是更倾向于大部分人能想到的那种,就是从头往后依次找空格,找到一个就把它换成%20,那么就是把它当成数组,但是记得要提前遍历一遍,把那个空格需要的空间提前申请上,然后再进行for循环替换。数据范围:0≤���(�)≤1000 0≤len(s)≤1000。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。请实现一个函数,将一个字符串s中的每个空格替换成“%20”。
文章浏览阅读4k次。硬件:A83T1.驱动加入VID和PID--- a/lichee/linux-3.4/drivers/usb/serial/option.c+++ b/lichee/linux-3.4/drivers/usb/serial/option.c@@ -948,6 +948,7 @@ static const struct usb_device_id option_ids[] = {..._h600/n501hs zte mf330 拨号
文章浏览阅读373次。在执行hdfs文件操作的时候抛异常 winutils问题的解决:该问题出现的地方是在对hdfs文件进行操作时,出现的原因是因为我将 hadoop安装在了虚拟机上,所以产生了该问题但该问题并不影响对hdfs文件的一些操作(比如下载hdfs文件到本地).解决方法:配置HADOOP_HOME, 我的电脑 ---->属性 ------> 高级系统配置新建中变量名为..._hdfs did not find winutils
文章浏览阅读1w次,点赞3次,收藏30次。kettle 加工抽取数据到另一个数据库运行常见的报错:DB2 SQLCODE=-206, SQLSTATE=42703 定义表字段问题 解决办法 检查建表字段(要用大写),在DB2中,默认情况下所有的名称都可包含字符:A-Z(大写) 0到9 @、#、$和_(下划线),名称不能以数字和下划线开头 ;Error: SQLCODE=-302, SQLSTATE=22001, SQLERR..._unexpected batch update error committing the database connection.
文章浏览阅读8k次,点赞42次,收藏97次。注:labelme是麻省理工(MIT)的计算机科学和人工智能实验室(CSAIL)研发的图像标注工具,人们可以使用该工具创建定制化标注任务或执行图像标注,项目源代码已经开源。通过labelme对图进行标注后,得到的是json文件,而Yolov5对数据进行模型构建的时候,读取需要的是txt格式的文件。txt_outer_path——保存txt文本的文件夹的绝对路径。json_name——json_name是json文本的名字。json_floder——读取json的文件夹的绝对路径。_多边形json转txt
文章浏览阅读829次,点赞17次,收藏22次。图像加密解密一直是信息安全领域的重要研究课题。随着技术的不断发展,传统的加密解密方法已经不能满足当今社会对信息安全的需求。因此,基于菲涅尔衍射相空间的图像加密解密方法应运而生,成为当前研究的热点之一。菲涅尔衍射是一种光学现象,通过它可以将物体表面的微小振动转化为光波的振幅和相位的变化。而相空间则是描述光波的振幅和相位信息的数学空间。基于菲涅尔衍射相空间的图像加密解密方法利用了这一原理,将图像信息转化为光波信息,通过菲涅尔衍射的特性进行加密处理,实现对图像信息的安全传输和存储。
文章浏览阅读2.3k次,点赞27次,收藏25次。来自小柴“傻逼”的抱怨和debug的好处入门Dev-c++ Debug需更改的操作入门操作后的Debug操作添加的变量为数组或者STL中的容器该如何去操作需要注意的问题和容易出错的点(建议看一下)_dev c++ debug
文章浏览阅读1w次。https://blog.csdn.net/zhangxiao0122/article/details/88570472根据论坛及博客整理。原有list集合, List<CommodityInfo> commodityInfoList = new List<CommodityInfo>(); public class CommodityInfo { public string StoreID {get; set;} .._c# list groupby
文章浏览阅读153次。1,什么是负载均衡?当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。下面详细介绍负载均..._高并发下负载调休