Android开发弹框横向进度条,Android实现简洁的APP更新dialog数字进度条

news/2024/7/5 11:52:09

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

发布时间:2020-09-17 20:54:59

来源:脚本之家

阅读:92

作者:曦笑大海

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

效果:

b73a2c676691128805fc38361966af0d.gif

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

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


http://www.niftyadmin.cn/n/3660194.html

相关文章

“CSDN 播报”第一次出现在CSDN视频节目里

网络媒体真的变化很快,不知什么时候开始,视频已经登陆到了各大网站。专家访谈,在线直播已经不是什么新鲜事。CSDN 也在这半年陆续推出了许多专家访谈类的视频。形式和内容组织还在探索中。最近,视频栏目的负责人阎辉找到我&#x…

如何用android studio测试,android studio如何用AndroidTestCase测试呢?出错

按照这种教程,还是出很多问题第一步:首先在AndroidManifest.xml中加入下面红色代码:package"com.lee0000.test" android:versionCode"1" android:versionName"1.0">***上面targetPackage指定的包要和应用的…

CSDN 内容体系架构现状分析——服务和子站

早早的就开设了这个栏目《CSDN 日记》,想与你分享我在CSDN 工作的点点滴滴。通过我的视角,帮你解读CSDN 。不过种种原因始终没有提笔。最近,正巧和单位韩磊聊起了CSDN未来的网站内容架构。现在的CSDN频道(.net,java,......)将来会以怎样的形式…

android studio gradle 使用jitpack,Android 发布开源库到 JitPack、jCenter

JitPack、jCenter是我们常用的发布Android开源库的网站,发布成功后就可以在Android Studio中通过Gradle方便的引用到项目中了,相比Eclipse时代要方便的多,对于使用者确实简单了,但对于发布者来说可能还略有坎坷,这里记…

趣闻:JBoss被redhat收购前 曾大骂redhat是狗屎

英文原文:http://www.theregister.co.uk/2006/04/10/fleury_redhat_critic/ 这几天最热门的新闻之一,就是 Linux龙头厂商 Redhat决定以三亿五千万美金,并购也算是龙头级的自由软件厂商 JBoss。JBoss的 Java应用软件服务器目前可以算是全世界最…

android 新闻app无限横移,Android ViewPager相册横向移动的实现方法

当我们第一次下载QQ并且打开的时候,会有一个新手引导,引导是几张图片,再加上一些文字说明,向右滑动,直到结束,今天一大早起来研究了一下关于此种效果的实现之ViewPager控件。下面这个例子将用ViewPager实现…

世界杯历史:1930年---2002年(乌拉圭---韩日)

1930乌拉圭世界杯  1928年的奥运会结束后,国际足联召开代表会议决定举办4年一届的世界足球锦标赛。 1934年意大利世界杯  由于第一届世界杯的成功举办,第二届世界杯在一片热望中如期举行了。 1938年法国世界杯  1938年的世界杯恐怕是气氛最为紧张…

手机android图片上传,android自定义View实现图片上传进度显示(仿手机QQ上传效果)...

首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果):再看一下我实现的效果:1、效果已经看见了,下面我们来实现它。首先我创建一个android工程ProgressImageView。然后我们重写ImageView控件,创建ProcessImageView类代码…