Android实现简洁的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());
 }
}

源码下载:dialog数字进度条

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

(0)

相关推荐

  • Android选择图片或拍照图片上传到服务器

    最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了!  不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片URI 具体上传代码: 1.选择图片和上传界面,包括上传完成和异常的回调监听 package com.spring.sky.image.upload; import java.util.HashMap; import java.util.Map; import android.app.Activi

  • Android 中自定义Dialog样式的Activity点击空白处隐藏软键盘功能(dialog不消失)

    一.需求触发场景: 项目中需要开发带有EditText的Dialog显示,要求在编辑完EditText时,点击Dilog的空白处隐藏软键盘.但是Dialog不会消失.示例如下: 二.实现方法: 发布需求时,我个人曾想过直接通过new的方式直接创建Dialog,经过多次尝试,无法实现要求,所以采用将Activity设置为Dialog样式进行展示,调用方法实现需求.具体实现如下: 本次演示示例的工程结构: 2.1AndroidMainfest.xml配置文件 需要在配置文件中将需要显示为dialog

  • Android中AlertDialog 点击按钮后不关闭对话框的功能

    这里的问题:当我点击确定按钮,也就是 AlertDialog 里的 PositiveButton 的时候,我们需要判断用户是输入是否符合我们的预期,如果不符合通常提示用户重写输入,且不关闭当前的对话框,但上图中点击按钮后会自动的关闭窗口. 先看原来的这个是怎么写的: private void openDialog() { LinearLayout linearLayout = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.l

  • Android中ProgressDialog的dismiss()与cancel()方法的区别

    progressDialog, 它有两个方法dialog.cancel() 和 dialog.dimiss() 1. public void cancel () Since: API Level 1 Cancel the dialog. This is essentially the same as calling dismiss(), but it will also call your DialogInterface.OnCancelListener (if registered). 2.p

  • Andoroid实现底部图片选择Dialog效果

    1.效果图如下 点击选择照相后,弹出如下选择对话框: 2. Dialog实现 布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical

  • Android实现本地图片选择及预览缩放效果

    在做项目时经常会遇到选择本地图片的需求,以前都是懒得写直接调用系统方法来选择图片,但是这样并不能实现多选效果,最近又遇到了,所以还是写一个demo好了,以后也方便使用.还是首先来看看效果: 显示的图片使用RecyclerView实现的,利用Glide来加载:下面弹出的图片文件夹效果是采用PopupWindow实现,这里比采用PopupWindow更方便,弹出显示的左边图片是这个文件夹里的第一张图片:选中的图片可以进行预览,使用网上一个大神写的来实现的:至于图片的获取是用ContentProvid

  • Android常用的AlertDialog对话框及自定义对话框

    常用的Dialog有确认对话框,单选按钮对话框,多选按钮对话框,复选按钮对话框另外还有自定义的对话框 AlertDialog的常用方法 setTitle:为对话框设置标题 setMessage:为对话框设置内容 setIcon:为对话框设置图标 setItems设置对话框要显示的list setMultiChoiceItems:一般用于复选框显示 setSingleChoiceItem:,设置单选按钮 setNeutralButton:普通按钮 setPositiveButton:添加确定按钮

  • Android拍照或从图库选择图片并裁剪

    今天看<第一行代码>上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的Demo. 一. 拍照选择图片 1.使用隐式Intent启动相机 //构建隐式Intent Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //调用系统相机 startActivityForResult(intent, 1); 2.处理相机拍照返回的结果 //用户点击了取消 if(data == n

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

    前言:现在一般的Android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新.当有更新时,会弹出一个提示框,点击下载,则在通知来创建一个数字进度条进行下载,下载成功后才到安装界面. 效果:  开发环境:AndroidStudio2.2.1+gradle-2.14.1 涉及知识: 1.Handler机制 2.自定义控件+Canvas绘画 3.自定义dialog 部分代码: public class NumberProgressBar extends V

  • android自定义view实现数字进度条

    之前看到过一个数字进度条,一直想写,今天就把这个实现下,想起来也是很简单的,先看下实现的效果: 思路: 绘制2根线 绘制进度条的文字,不断的改变起点和终点,然后没多少时间去更新UI就ok,在这就不画图了,看代码就看的明白,不要想的很复杂! package com.tuya; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import a

  • Android ProgressDialog用法之实现app上传文件进度条转圈效果

    ProgressDialog 继承自AlertDialog,AlertDialog继承自Dialog public class ProgressDialog extends AlertDialog ProgressDialog的创建方式有两种,一种是new ProgressDialog,一种是调用ProgressDialog的静态方法show()创建并显示,这种进度条只能是圆形条. ProgressDialog dialog = ProgressDialog.show(this, "提示&quo

  • Android编程实现显示在标题上的进度条功能【附源码下载】

    本文实例讲述了Android编程实现显示在标题上的进度条功能.分享给大家供大家参考,具体如下: 今天我们来学习一下Android中显示在Activity标题上的进度条.在这个例子当中我们还能够学习到很多关于AsyncTask的知识. (1)准备用于显示到界面上的四张图片img01,img02,img03,img04 (2)在Activity的布局文件activity_main.xml中只定义一个线性布局LinearLayout,并为其设置一个id,代码如下: <LinearLayout xmln

  • Android studio实现日期 、时间选择器与进度条

    本文实例为大家分享了Android studio实现日期 .时间选择器与进度条,供大家参考,具体内容如下 日期选择器 public void onclick(View v){         Calendar calendar=Calendar.getInstance();         new DatePickerDialog( this, new DatePickerDialog.OnDateSetListener() {             @Override            

  • Android三种方式实现ProgressBar自定义圆形进度条

    进度条样式在项目中经常可以见到,下面小编给大家分享Android三种方式实现ProgressBar自定义圆形进度条. Android进度条有4种风格可以使用. 默认值是progressBarStyle. 设置成progressBarStyleSmall后,图标变小. 设置成progressBarStyleLarge后,图标变大 设置成progressBarStyleHorizontal后,变成横向长方形. 自定义圆形进度条ProgressBar的一般有三种方式: 一.通过动画实现 定义res/a

  • Android 自定义view和属性动画实现充电进度条效果

    近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和自定义view的方式来完成这个功能,将它开源出来,供有需要的人了解一下相关的内容. 本次实现的功能类似下面的效果: 接下来便详细解析一下如何完成这个功能,了解其中的原理,这样就能举一反三,实现其他类似的动画效果了. 详细代码请看大屏幕 https://github.com/crazyandcoder

  • android 中win10 使用uwp控件实现进度条Marquez效果

    本文将告诉大家,如何做一个带文字的进度条,这个进度条可以用在游戏,现在我做的挂机游戏就使用了他. 如何做上图的效果,实际需要的是两个控件,一个是显示文字 的 TextBlock 一个是进度条. 那么如何让 文字和左边的距离变化?使用 TranslateTransform 看起来 Marquez 的界面就是: <ProgressBar x:Name="Mcdon" Maximum="100" Minimum="0" Value="2

  • Android开发之模仿微信打开网页的进度条效果(高仿)

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是实现方法都是一样的,而且,都忽略了微信加载网页时,进度条的缓慢动画效果,它不是生硬地一滑而过,而是用户体验很好,有个速度的变化,由慢到快的效果,语言难于描述,相信各位都有下载微信,可以随便打开个公众号的文章看看效果. 好了,上面说到,之前网上的方法都是都忽略了微信加载网页时,进度条的缓慢动画效果,实现代码也是

  • Android自定义View仿华为圆形加载进度条

    View仿华为圆形加载进度条效果图 实现思路 可以看出该View可分为三个部分来实现 最外围的圆,该部分需要区分进度圆和底部的刻度圆,进度部分的刻度需要和底色刻度区分开来 中间显示的文字进度,需要让文字在View中居中显示 旋转的小圆点,小圆点需要模拟小球下落运动时的加速度效果,开始下落的时候慢,到最底部时最快,上来时速度再逐渐减慢 具体实现 先具体细分讲解,博客最后面给出全部源码 (1)首先为View创建自定义的xml属性 在工程的values目录下新建attrs.xml文件 <resourc

随机推荐