DialogPlus实现版本升级下载的弹框dialog样式

先上效果图,升级带下载功能

第一步:加入依赖

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值