zoukankan      html  css  js  c++  java
  • App更新之dialog数字进度条

    App更新之dialog数字进度条

     

    前言现在一般的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());
        }
    }

     

     

    源码下载...

     

  • 相关阅读:
    TreeView 控件选中项变色
    遍历repeater
    堆和栈,类型声明实例化过程,string=null;string=”“的区别;
    用Oled操作EXCEL碰到错误
    修改部分代码,让优酷和ckplayer可覆盖,优酷播放的部分API。
    C# 拼接字符串,自实现翻页功能
    总结Vue第二天:自定义子组件、父子组件通信、插槽
    总结Vue第一天:简单介绍、基本常用知识、辅助函数
    总结Vue第三天:模块化和webpack模块化打包:
    PHP之冒泡排序
  • 原文地址:https://www.cnblogs.com/xxdh/p/6693857.html
Copyright © 2011-2022 走看看