Android實(shí)現(xiàn)簡(jiǎn)潔的APP更新dialog數(shù)字進(jìn)度條
前言:現(xiàn)在一般的Android軟件都是需要不斷更新的,當(dāng)你打開某個(gè)app的時(shí)候,如果有新的版本,它會(huì)提示你有新版本需要更新。當(dāng)有更新時(shí),會(huì)彈出一個(gè)提示框,點(diǎn)擊下載,則在通知來(lái)創(chuàng)建一個(gè)數(shù)字進(jìn)度條進(jìn)行下載,下載成功后才到安裝界面。
效果:

開發(fā)環(huán)境:AndroidStudio2.2.1+gradle-2.14.1
涉及知識(shí):
1.Handler機(jī)制
2.自定義控件+Canvas繪畫
3.自定義dialog
部分代碼:
public class NumberProgressBar extends View {
/**
* 右側(cè)未完成進(jìn)度條的顏色
*/
private int paintStartColor = 0xffe5e5e5;
/**
* Contxt
*/
private Context context;
/**
* 主線程傳過來(lái)進(jìn)程 0 - 100
*/
private int progress;
/**
* 得到自定義視圖的寬度
*/
private int viewWidth;
private RectF pieOval;
private RectF pieOvalIn;
/**
* 得到自定義視圖的Y軸中心點(diǎn)
*/
private int viewCenterY;
/**
* 已完成的畫筆
*/
private Paint paintInit = new Paint();
/**
* 未完成進(jìn)度條畫筆的屬性
*/
private Paint paintStart = new Paint();
/**
* 大圓的畫筆
*/
private Paint paintEndBig = new Paint();
/**
* 小圓的畫筆
*/
private Paint paintSmall = new Paint();
/**
* 畫中間的百分比文字的畫筆
*/
private Paint paintText = new Paint();
/**
* 要畫的文字的寬度
*/
private int textWidth;
/**
* 畫文字時(shí)底部的坐標(biāo)
*/
private float textBottomY;
private int smallR;//小圓的半徑
private int bigR;//大圓半徑
private float radius;
private int jR;//氣泡矩形
/**
* 文字總共移動(dòng)的長(zhǎng)度(即從0%到100%文字左側(cè)移動(dòng)的長(zhǎng)度)
*/
// private int totalMovedLength;
public NumberProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
// 構(gòu)造器中初始化數(shù)據(jù)
smallR = dip2px(context, 4);//小圓半徑
bigR = dip2px(context, 8);//大圓半徑
radius = dip2px(context, 10) / 2;//進(jìn)度條高度
jR = dip2px(context, 6);//矩形
initData();
}
/**
* 初始化數(shù)據(jù)
*/
private void initData() {
// 未完成進(jìn)度條畫筆的屬性
paintStart.setColor(paintStartColor);
paintStart.setStrokeWidth(dip2px(context, 1));
paintStart.setDither(true);
paintStart.setAntiAlias(true);
paintStart.setStyle(Paint.Style.FILL);
// 已完成進(jìn)度條畫筆的屬性
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); //設(shè)置百分比文字的尺寸
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型進(jìn)度
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.畫筆對(duì)象
*/
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);
//圓角矩形--進(jìn)行中
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 外部傳進(jìn)來(lái)的當(dāng)前進(jìn)度
*/
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());
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)APP在線下載更新
- 基于Retrofit2+RxJava2實(shí)現(xiàn)Android App自動(dòng)更新
- android中強(qiáng)制更新app實(shí)例代碼
- Android應(yīng)用App更新實(shí)例詳解
- Android應(yīng)用APP自動(dòng)更新功能的代碼實(shí)現(xiàn)
- Android App增量更新詳解及實(shí)例代碼
- Android如何實(shí)現(xiàn)APP自動(dòng)更新
- Android App實(shí)現(xiàn)應(yīng)用內(nèi)部自動(dòng)更新的最基本方法示例
- android實(shí)現(xiàn)通知欄下載更新app示例
- Android實(shí)現(xiàn)APP自動(dòng)更新功能
相關(guān)文章
Android實(shí)現(xiàn)的仿淘寶購(gòu)物車demo示例
這篇文章主要介紹了Android實(shí)現(xiàn)的仿淘寶購(gòu)物車demo示例,結(jié)合實(shí)例形式分析了Android購(gòu)物車的功能、布局及邏輯實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-07-07
android使用Messenger綁定Service的多種實(shí)現(xiàn)方法
android使用Messenger綁定Service的多種實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-05-05
Android SDK Manager解決更新時(shí)的問題 :Failed to fetch URL...
本文主要介紹解決安裝使用SDK Manager更新時(shí)的問題:Failed to fetch URL...,這里提供了詳細(xì)的資料及解決問題辦法,有需要的小伙伴可以參考下2016-09-09
Android中定時(shí)執(zhí)行任務(wù)的3種實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)?lái)一篇Android中定時(shí)執(zhí)行任務(wù)的3種實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2016-11-11
android開發(fā)修改狀態(tài)欄背景色和圖標(biāo)顏色的示例
本篇文章主要介紹了android開發(fā)修改狀態(tài)欄背景色和圖標(biāo)顏色的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-01-01
Android編程實(shí)現(xiàn)為L(zhǎng)istView創(chuàng)建上下文菜單(ContextMenu)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)為L(zhǎng)istView創(chuàng)建上下文菜單(ContextMenu)的方法,簡(jiǎn)單分析了上下文菜單的功能及ListView創(chuàng)建上下文菜單(ContextMenu)的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
Android項(xiàng)目實(shí)現(xiàn)黑名單攔截效果
本篇文章主要介紹了Android項(xiàng)目實(shí)現(xiàn)黑名單攔截效果,可以根據(jù)白名單或者黑名單攔截,測(cè)試可以攔截電話,有需要的朋友可以了解一下。2016-10-10
Android中使用Kotlin實(shí)現(xiàn)一個(gè)簡(jiǎn)單的登錄界面
Kotlin 是一種在 Java 虛擬機(jī)上運(yùn)行的靜態(tài)類型編程語(yǔ)言,被稱之為 Android 世界的Swift,由 JetBrains 設(shè)計(jì)開發(fā)并開源。接下來(lái)本文通過實(shí)例代碼給大家講解Android中使用Kotlin實(shí)現(xiàn)一個(gè)簡(jiǎn)單的登錄界面,一起看看吧2017-09-09
Android實(shí)現(xiàn)屏蔽微信拉黑和刪除聯(lián)系人功能示例
本篇文章主要介紹了Android實(shí)現(xiàn)屏蔽微信拉黑和刪除聯(lián)系人功能示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-02-02

