先上效果图,升级带下载功能
第一步:加入依赖
implementation 'com.orhanobut:dialogplus:1.11@aar'
第二步实现布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="@dimen/space_130"
android:layout_gravity="center_horizontal"
android:scaleType="fitXY"
android:src="@drawable/update" />
<TextView
android:id="@+id/tv_title_up"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="center_horizontal"
android:paddingTop="10dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="发现最新版本,是否更新升级?"
android:textColor="#000000"
android:textSize="16sp"/>
<TextView
android:id="@+id/tv_con"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="left"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="15dp"
android:text="V1.1.10"
android:textColor="@color/gray2"
android:textSize="14sp" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/white"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:paddingTop="20dp"
android:paddingBottom="20dp">
<Button
android:id="@+id/btn_upDate"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:background="@drawable/shape52"
android:text="升级"
android:textColor="#ffffff"
android:textSize="15sp"/>
<!--进度条 radius:弧度-->
<com.glens.jksd.utils.RxProgressBar
android:id="@+id/number_progress_bar"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white"
android:layout_centerVertical="true"
app:loadingColor="#40c4ff"
app:radius="30dp"
app:stopColor="#ff9800"
app:textSize="12sp"
android:visibility="gone"/>
</RelativeLayout>
</LinearLayout>
<ImageView
android:layout_width="20dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/shu_bg" />
<TextView
android:id="@+id/img_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/close_bg"
android:layout_gravity="center_horizontal"
android:textSize="12sp"
android:textColor="@color/color_main_select_no"
android:gravity="center_horizontal"/>
</LinearLayout>
update.png
shape52
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 填充的颜色 -->
<solid android:color="@color/color_main_select_no" />
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:radius="50dip"/>
<!-- padding:Button里面的文字与Button边界的间隔 -->
</shape>
shu_bg
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="60dp"
android:viewportHeight="1024.0"
android:viewportWidth="1024.0">
<path
android:fillColor="#8a8a8a"
android:pathData="M512,1020.5c-13.8,0 -25,-11.2 -25,-25V28.1c0,-13.8 11.2,-25 25,-25s25,11.2 25,25v967.4c0,13.8 -11.2,25 -25,25z" />
</vector>
close_bg
<vector android:height="35dp" android:viewportHeight="1024.0"
android:viewportWidth="1024.0" android:width="35dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#dbdbdb" android:pathData="M512.8,62c-248.5,0 -450,201.5 -450,450s201.5,450 450,450 450,-201.5 450,-450 -201.4,-450 -450,-450zM512.8,898c-213.2,0 -386,-172.8 -386,-386s172.8,-386 386,-386 386,172.8 386,386 -172.8,386 -386,386z"/>
<path android:fillColor="#dbdbdb" android:pathData="M660.5,360.1c-12.5,-12.5 -32.8,-12.5 -45.3,0 -0.8,0.8 -1.5,1.6 -2.2,2.4L510.2,465.4 407.3,362.5c-0.7,-0.8 -1.4,-1.6 -2.2,-2.4 -12.5,-12.5 -32.8,-12.5 -45.3,0s-12.5,32.6 -0.1,45.1l-0.1,0.1L465,510.7 362.3,613.3c-0.8,0.7 -1.6,1.4 -2.4,2.2 -12.5,12.5 -12.5,32.8 0,45.3s32.6,12.5 45.1,0.1l0.1,0.1 105.1,-105.1 104,104 0.1,-0.1c0.3,0.3 0.6,0.6 0.9,1 12.5,12.5 32.8,12.5 45.3,0s12.5,-32.8 0,-45.3c-0.8,-0.8 -1.6,-1.5 -2.4,-2.2L555.5,510.7l104.2,-104.2 -0.1,-0.1c0.3,-0.3 0.6,-0.6 1,-0.9 12.4,-12.6 12.4,-32.9 -0.1,-45.4z"/>
</vector>
color_main_select_no #45a6f6
在activity的操作
/**
* 以下是检查新版本相关操作
*/
RxProgressBar progressBar;
Button btn_upDate;
DialogPlus authDialog;
private void judgeVersionMeths(String versionOld, String versionNew, final String apkName, final String apkPath) {
if (TextUtils.isEmpty(versionNew) && TextUtils.isEmpty(versionOld) && TextUtils.isEmpty(apkName) && TextUtils.isEmpty(apkPath))
return;
//.替换空字符串
long oldVer = Long.parseLong(versionOld.replace(".", ""));
long newVer = Long.parseLong(versionNew.replace(".", ""));
if (newVer > oldVer) {
// Toast.makeText(mContextThis, "发现新版本", Toast.LENGTH_SHORT).show();
View authView = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_update_version, null);
TextView tv_title = (TextView) authView.findViewById(R.id.tv_title_up);
TextView tv_content = (TextView) authView.findViewById(R.id.tv_con);
btn_upDate = (Button) authView.findViewById(R.id.btn_upDate);
progressBar = (RxProgressBar) authView.findViewById(R.id.number_progress_bar);
progressBar.setVisibility(View.GONE);
// tv_title.setText("是否从" + versionOld + "升级到" + versionNew + "版本?");
tv_title.setText("发现新版本");
tv_content.setText("1.电缆采集功能添加管孔不同形状的优化。"
+ "\n" + "2.优化低压表箱二维码扫描出现数据错乱的问题。"
+ "\n" + "3.优化加载用户手册pdf格式时放大模糊的问题。"
+ "\n" + "4.优化采集线路关系更新坐标时档线类型自动改变的问题。");
authDialog = DialogPlus.newDialog(MainActivity.this)
.setContentHolder(new ViewHolder(authView))
.setGravity(Gravity.CENTER)
// .setPadding(15, 20, 15, 20)
// .setContentWidth(activityUtils.getScreenWidth() - 120)
.setContentBackgroundResource(R.color.transparent2)
.setCancelable(false)
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final DialogPlus dialog, View view) {
switch (view.getId()) {
case R.id.btn_upDate://升级
if (CommonUtils.is4rd(MainActivity.this)) {
usualDialogger = UsualDialogger.Builder(MainActivity.this)
.setTitle("提示")
.setMessage("您当前尚未连接WIFI,是否使用流量下载?")
.setOnConfirmClickListener("确定", view1 -> {
downLoadApk(apkPath, apkName);
if (usualDialogger != null) {
usualDialogger.dismiss();
}
})
.setOnCancelClickListener("取消", view12 -> {
if (usualDialogger != null) {
usualDialogger.dismiss();
}
}).build()
.shown();
} else {
downLoadApk(apkPath, apkName);
}
break;
case R.id.img_close://关闭
// AppClassContext.getInstance().closeAllActivity();
// finish();
authDialog.dismiss();
// if (dialog.isShowing()) dialog.dismiss();
break;
}
}
})
.create();
authDialog.show();
}
}
//下载apk
private void downLoadApk(String apkUrl, final String apkName) {
if (TextUtils.isEmpty(apkUrl)) {
Toast.makeText(MainActivity.this, "apk路径为null", Toast.LENGTH_SHORT).show();
return;
}
// String ipUrl = InstanceMethodUtils.getInstance().getIpApi();
// Log.e(TAG, "DownLoadApk: " + ipUrl + apkUrl + " /Glens_opsBao/downloadApk/" + apkName);
DownloadApk.get().download(apkPath, "/Glens_opsBao/downloadApk/", apkName,
new DownloadApk.OnDownloadListener() {
@Override
public void onDownloadSuccess(final File file) {//下载成功 安装
runOnUiThread(new Runnable() {
@Override
public void run() {
if (authDialog.isShowing()) authDialog.dismiss();
installApk(file);
}
});
}
@Override
public void onDownloading(final int progress) {
runOnUiThread(new Runnable() {
@Override
public void run() {
btn_upDate.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(progress);
}
});
}
@Override
public void onDownloadFailed(final IOException e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "下载失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
});
}
/**
* apk安装
*
* @param apkFile
*/
private void installApk(File apkFile) {
if (!apkFile.exists()) {
return;
}
// 通过Intent安装APK文件
/* Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file://" + apkFile.toString()), "application/vnd.android.package-archive");
startActivity(i);*/
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
setIntentDataAndType(this, intent, "application/vnd.android.package-archive", apkFile, true);
startActivity(intent);
// finish();
}
public void setIntentDataAndType(Context context,
Intent intent,
String type,
File file,
boolean writeAble) {
if (Build.VERSION.SDK_INT >= 24) {
intent.setDataAndType(FileProvider7.getUriForFile(context, file), type);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (writeAble) {
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
} else {
intent.setDataAndType(Uri.fromFile(file), type);
}
}
记得添加 Manifest.permission.REQUEST_INSTALL_PACKAGES 权限
package com.glens.jksd.utils;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
import com.glens.jksd.R;
/**
*
* @author vondear
* @date 2016/8/26
* 描述:添加圆角支持 on 2016/11/11
* </br>
*/
public class RxProgressBar extends View implements Runnable {
private PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP);
private int DEFAULT_HEIGHT_DP = 35;
private int borderWidth;
private float maxProgress = 100f;
private Paint textPaint;
private Paint bgPaint;
private Paint pgPaint;
private String progressText;
private Rect textRect;
private RectF bgRectf;
/**
* 左右来回移动的滑块
*/
private Bitmap flikerBitmap;
/**
* 滑块移动最左边位置,作用是控制移动
*/
private float flickerLeft;
/**
* 进度条 bitmap ,包含滑块
*/
private Bitmap pgBitmap;
private Canvas pgCanvas;
/**
* 当前进度
*/
private float progress;
private boolean isFinish;
private boolean isStop;
/**
* 下载中颜色
*/
private int loadingColor;
/**
* 暂停时颜色
*/
private int pauseColor;
/**
* 完成时的颜色
*/
private int finishColor;
/**
* 进度停下来的颜色
*/
private int stopColor;
/**
* 进度文本、边框、进度条颜色
*/
private int progressColor;
private int textSize;
private int radius;
private Thread thread;
BitmapShader bitmapShader;
public RxProgressBar(Context context) {
this(context, null, 0);
}
public RxProgressBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RxProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initAttrs(attrs);
}
private void initAttrs(AttributeSet attrs) {
TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.FlikerProgressBar);
try {
textSize = (int) ta.getDimension(R.styleable.FlikerProgressBar_textSize, 12);
loadingColor = ta.getColor(R.styleable.FlikerProgressBar_loadingColor, Color.parseColor("#40c4ff"));
pauseColor = ta.getColor(R.styleable.FlikerProgressBar_stopColor, Color.parseColor("#ff9800"));
finishColor = ta.getColor(R.styleable.FlikerProgressBar_finishColor, Color.parseColor("#3CB371"));
radius = (int) ta.getDimension(R.styleable.FlikerProgressBar_radius, 0);
borderWidth = (int) ta.getDimension(R.styleable.FlikerProgressBar_borderWidth, 1);
} finally {
ta.recycle();
}
}
private void init() {
bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
bgPaint.setStyle(Paint.Style.STROKE);
bgPaint.setStrokeWidth(borderWidth);
pgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
pgPaint.setStyle(Paint.Style.FILL);
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(textSize);
textRect = new Rect();
bgRectf = new RectF(borderWidth, borderWidth, getMeasuredWidth() - borderWidth, getMeasuredHeight() - borderWidth);
if(isStop){
progressColor = pauseColor;
} else{
progressColor = loadingColor;
}
flikerBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.progress_flicker);
flickerLeft = -flikerBitmap.getWidth();
initPgBimap();
}
private void initPgBimap() {
pgBitmap = Bitmap.createBitmap(getMeasuredWidth() - borderWidth, getMeasuredHeight() - borderWidth, Bitmap.Config.ARGB_8888);
pgCanvas = new Canvas(pgBitmap);
thread = new Thread(this);
thread.start();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
int height = 0;
switch (heightSpecMode){
case MeasureSpec.AT_MOST:
height = dp2px(DEFAULT_HEIGHT_DP);
break;
case MeasureSpec.EXACTLY:
case MeasureSpec.UNSPECIFIED:
height = dp2px(DEFAULT_HEIGHT_DP);
break;
}
setMeasuredDimension(widthSpecSize, height);
if(pgBitmap == null){
init();
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//背景
drawBackGround(canvas);
//进度
drawProgress(canvas);
//进度text
drawProgressText(canvas);
//变色处理
drawColorProgressText(canvas);
}
/**
* 边框
* @param canvas
*/
private void drawBackGround(Canvas canvas) {
bgPaint.setColor(progressColor);
//left、top、right、bottom不要贴着控件边,否则border只有一半绘制在控件内,导致圆角处线条显粗
canvas.drawRoundRect(bgRectf, radius, radius, bgPaint);
}
/**
* 进度
*/
private void drawProgress(Canvas canvas) {
pgPaint.setColor(progressColor);
float right = (progress / maxProgress) * getMeasuredWidth();
pgCanvas.save();
pgCanvas.clipRect(0, 0, right, getMeasuredHeight());
pgCanvas.drawColor(progressColor);
pgCanvas.restore();
if(!isStop){
pgPaint.setXfermode(xfermode);
pgCanvas.drawBitmap(flikerBitmap, flickerLeft, 0, pgPaint);
pgPaint.setXfermode(null);
}
//控制显示区域
bitmapShader = new BitmapShader(pgBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
pgPaint.setShader(bitmapShader);
canvas.drawRoundRect(bgRectf, radius, radius, pgPaint);
}
/**
* 进度提示文本
* @param canvas
*/
private void drawProgressText(Canvas canvas) {
textPaint.setColor(progressColor);
progressText = getProgressText();
textPaint.getTextBounds(progressText, 0, progressText.length(), textRect);
int tWidth = textRect.width();
int tHeight = textRect.height();
float xCoordinate = (getMeasuredWidth() - tWidth) / 2;
float yCoordinate = (getMeasuredHeight() + tHeight) / 2;
canvas.drawText(progressText, xCoordinate, yCoordinate, textPaint);
}
/**
* 变色处理
* @param canvas
*/
private void drawColorProgressText(Canvas canvas) {
textPaint.setColor(Color.WHITE);
int tWidth = textRect.width();
int tHeight = textRect.height();
float xCoordinate = (getMeasuredWidth() - tWidth) / 2;
float yCoordinate = (getMeasuredHeight() + tHeight) / 2;
float progressWidth = (progress / maxProgress) * getMeasuredWidth();
if(progressWidth > xCoordinate){
canvas.save();
float right = Math.min(progressWidth, xCoordinate + tWidth * 1.1f);
canvas.clipRect(xCoordinate, 0, right, getMeasuredHeight());
canvas.drawText(progressText, xCoordinate, yCoordinate, textPaint);
canvas.restore();
}
}
public void setProgress(float progress){
if(!isStop){
if(progress < maxProgress){
this.progress = progress;
} else {
this.progress = maxProgress;
finishLoad();
}
invalidate();
}
}
private void setFinish(boolean stop) {
isStop = stop;
if(isStop){
progressColor = finishColor;
thread.interrupt();
} else {
progressColor = loadingColor;
thread = new Thread(this);
thread.start();
}
invalidate();
}
public void setStop(boolean stop) {
isStop = stop;
if(isStop){
progressColor = pauseColor;
thread.interrupt();
} else {
progressColor = loadingColor;
thread = new Thread(this);
thread.start();
}
invalidate();
}
public void finishLoad() {
isFinish = true;
setFinish(true);
}
public void toggle(){
if(!isFinish){
if(isStop){
setStop(false);
} else {
setStop(true);
}
}
}
@Override
public void run() {
int width = flikerBitmap.getWidth();
try {
while (!isStop && !thread.isInterrupted()){
flickerLeft += dp2px(5);
float progressWidth = (progress / maxProgress) * getMeasuredWidth();
if(flickerLeft >= progressWidth){
flickerLeft = -width;
}
postInvalidate();
Thread.sleep(20);
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 重置
*/
public void reset(){
setStop(true);
progress = 0;
isFinish = false;
isStop = false;
progressColor = loadingColor;
progressText = "";
flickerLeft = -flikerBitmap.getWidth();
initPgBimap();
}
public float getProgress() {
return progress;
}
public boolean isStop() {
return isStop;
}
public boolean isFinish() {
return isFinish;
}
private String getProgressText() {
String text= "";
if(!isFinish){
if(!isStop){
text = "下载中" + progress + "%";
} else {
text = "继续";
}
} else{
text = "下载完成";
}
return text;
}
private int dp2px(int dp){
float density = getContext().getResources().getDisplayMetrics().density;
return (int) (dp * density);
}
}
UsualDialogger usualDialogger
请查看上一篇文章 https://blog.csdn.net/sinat_26397681/article/details/100740953