Android实现百分比下载进度条效果

现在很多APP中都会集成下载功能,所以有一个方便好看又实用的进度条来展示下载进度很有必要,也能提高用户体验,在这里我就把项目里的下载进度条抽取出来分享给大家,话不多说,先看效果图:

这个进度条是自定义的一个View,其中有一个自定义属性就是百分比文字的大小(也可以把那两条显示颜色的进度条自定义属性,这里就没有实现,在代码里面写的)。

先说说实现原理:

1:由于自定义了属性,所以先获取属性的值。

2:绘制底色那条灰色的线。

3:根据传入的数据计算当前百分比,然后绘制那条橘黄色的线。

4:再在橘黄色线后面把百分比的文字绘制出来就OK了。

现在来看看代码:

一:属性设置attrs.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="downloadProgressBar">
 <attr name="dptextsize" format="dimension"/>
 </declare-styleable>
</resources> 

其中dptextsize就是自定义属性的名字

二:自定义view DownLoadProgressbar.Java

package com.ywl5320.downloadprogressdemo.downloadview; 

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener; 

import com.ywl5320.downloadprogressdemo.R; 

/**
 * 下载进度条
 *
 * @author ywl
 *
 */
public class DownLoadProgressbar extends View { 

 private Paint paint = new Paint(); // 绘制背景灰色线条画笔
 private Paint paintText = new Paint(); // 绘制下载进度画笔
 private float offset = 0f; // 下载偏移量
 private float maxvalue = 0f; // 下载的总大小
 private float currentValue = 0f; // 下载了多少
 private Rect mBound = new Rect(); // 获取百分比数字的长宽
 private String percentValue = "0%"; // 要显示的现在百分比
 private float offsetRight = 0f; // 灰色线条距离右边的距离
 private int textSize = 25; // 百分比的文字大小
 private float offsetTop = 18f; // 距离顶部的偏移量 

 public DownLoadProgressbar(Context context) {
 this(context, null);
 // TODO Auto-generated constructor stub
 } 

 public DownLoadProgressbar(Context context, AttributeSet attribute) {
 this(context, attribute, 0);
 } 

 public DownLoadProgressbar(Context context, AttributeSet attrs,
  int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 // TODO Auto-generated constructor stub
 // 获取自定义属性,给textsize赋初始值
 TypedArray t = getContext().obtainStyledAttributes(attrs,
  R.styleable.downloadProgressBar);
 textSize = (int) t.getDimension(
  R.styleable.downloadProgressBar_dptextsize, 36);
 getTextWidth();
 } 

 @Override
 protected void onDraw(Canvas canvas) {
 // TODO Auto-generated method stub
 super.onDraw(canvas);
 // 绘制底色
 paint.setColor(getResources().getColor(R.color.no1_gray_light));
 paint.setStrokeWidth(1);
 canvas.drawLine(0, offsetTop, getWidth(), offsetTop, paint);
 // 绘制进度条颜色
 paint.setColor(getResources().getColor(R.color.no2_orange));
 paint.setStrokeWidth(2);
 canvas.drawLine(0, offsetTop, offset, offsetTop, paint);
 // 绘制白色区域及百分比
 paint.setColor(getResources().getColor(R.color.no3_white));
 paint.setStrokeWidth(1);
 paintText.setColor(getResources().getColor(R.color.no2_orange));
 paintText.setTextSize(textSize);
 paintText.setAntiAlias(true);
 paintText.getTextBounds(percentValue, 0, percentValue.length(), mBound);
 canvas.drawLine(offset, offsetTop, offset + mBound.width() + 4, offsetTop, paint);
 canvas.drawText(percentValue, offset, offsetTop + mBound.height() / 2 - 2, paintText);
 } 

 /**
 * 设置当前进度值
 *
 * @param currentValue
 */
 public void setCurrentValue(float currentValue) {
 this.currentValue = currentValue;
 int value = (int) (this.currentValue / maxvalue * 100);
 if (value < 100) {
  percentValue = value + "%";
 } else {
  percentValue = "100%";
 }
 initCurrentProgressBar();
 invalidate();
 } 

 /**
 * 设置最大值
 *
 * @param maxValue
 */
 public void setMaxValue(float maxValue) {
 this.maxvalue = maxValue;
 } 

 /**
 * 获取当前进度条长度
 *
 * @param maxValue
 * @param currentValue
 * @return
 */
 public void initCurrentProgressBar() {
 getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

  @Override
  public void onGlobalLayout() {
  // TODO Auto-generated method stub
  if (currentValue < maxvalue) {
   offset = (getWidth() - offsetRight) * currentValue / maxvalue;
  } else {
   offset = getWidth() - offsetRight;
  }
  }
 }); 

 } 

 /**
 * 获取“100%”的宽度
 */
 public void getTextWidth() {
 Paint paint = new Paint();
 Rect rect = new Rect();
 paint.setTextSize(textSize);
 paint.setAntiAlias(true);
 paint.getTextBounds("100%", 0, "100%".length(), rect);
 offsetRight = rect.width() + 5;
 }
} 

这就是实现代码,代码不多,注解也有,不是很难。使用时只需传入文件最大值,当前下载了多少就能自动计算出百分比。如果循环传入,就实现了动态跑动的效果。

三:Activity布局文件 activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 xmlns:ywl="http://schemas.android.com/apk/res/com.ywl5320.downloadprogressdemo" <!-- 这就是为自定义属性添加命名空间,注意res后的是:程序包名-->
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@color/no3_white"
 tools:context="${relativePackage}.${activityClass}" > 

 <TextView
 android:id="@+id/tv_start"
 android:layout_width="match_parent"
 android:layout_height="50dip"
 android:layout_below="@+id/rl_progress"
 android:layout_marginTop="40dip"
 android:layout_marginLeft="20dip"
 android:layout_marginRight="20dip"
 android:gravity="center"
 android:background="@drawable/btn_blue_selector"
 android:text="开始"/> 

 <RelativeLayout
 android:id="@+id/rl_progress"
 android:layout_width="match_parent"
 android:layout_marginLeft="20dip"
 android:layout_marginRight="20dip"
 android:layout_marginTop="30dip"
 android:layout_height="50dip">
 <TextView
  android:id="@+id/tv_size"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginTop="4dip"
  android:textColor="@color/no5_gray_silver"
  android:textSize="12sp" /> 

 <TextView
  android:id="@+id/tv_speed"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentRight="true"
  android:layout_marginTop="6dip"
  android:textColor="@color/no5_gray_silver"
  android:textSize="12sp" /> 

 <com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar
  android:id="@+id/dp_game_progress"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  ywl:dptextsize="14sp" <!-- 这里设置控件的字体大小为14sp -->
  android:layout_below="@+id/tv_size">
 </com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar>
 </RelativeLayout> 

</RelativeLayout> 

程序中的文件大小,当前下载量和下载速度,都是在这里布局的,用的时候可以动态设置就行了,也可以把这个布局文件封装为listview的item布局文件,那样就可以制作下载列表了。

四:MainAcativity.java

package com.ywl5320.downloadprogressdemo; 

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView; 

import com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar; 

public class MainActivity extends Activity { 

 private TextView mStart;
 private TextView mSize;
 private TextView mSpeed;
 private DownLoadProgressbar mProgress;
 private int max = 100; //总的大小
 private int current = 0; //当前下载大小
 private String speed = "1"; //下载速度 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 mStart = (TextView) findViewById(R.id.tv_start);
 mProgress = (DownLoadProgressbar) findViewById(R.id.dp_game_progress);
 mSize = (TextView) findViewById(R.id.tv_size);
 mSpeed = (TextView) findViewById(R.id.tv_speed);
 //初始化下载进度
 mSize.setText(current + "MB/" + max + "MB");
 //初始化下载速度
 mSpeed.setText(speed + "MB/s");
 mStart.setOnClickListener(new OnClickListener() { 

  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  start();
  }
 });
 } 

 //循环模拟下载过程
 public void start() {
 if (current <= max) {
  mSize.setText(current + "MB/" + max + "MB");
  mSpeed.setText(speed + "MB/s");
  mProgress.setMaxValue(max);
  mProgress.setCurrentValue(current);
  handler.postDelayed(runnable, 100);
 } else {
  handler.removeCallbacks(runnable);
 } 

 } 

 Handler handler = new Handler();
 Runnable runnable = new Runnable() {
 @Override
 public void run() {
  // TODO Auto-generated method stub
  current = current + 1;
  start();
 }
 }; 

} 

就这样一个简单实用的下载百分比进度条就实现了,有需要可以直接用就行:Android百分比下载进度条

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

(0)

相关推荐

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

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

  • Android自定义View实现水平带数字百分比进度条

    这个进度条可以反映真实进度,并且完成百分比的文字时随着进度增加而移动的,所在位置也恰好是真实完成的百分比位置,效果如下: 思路如下:第一部分是左侧的蓝色直线,代表已经完成的进度:第二部分是右侧灰色的直线,代表未完成的进度:第三部分是红色的百分比的数字百分比文本,显示当前确切的完成进度. 最关键的部分就是要确定百分比文本的确切位置,这里用了paint的getTextBounds方法,得到文本的宽高,然后再精确确定它的位置. view代码如下: public class NumberProgress

  • Android自定义View实现圆环带数字百分比进度条

    分享一个自己制作的Android自定义View.是一个圆环形状的反映真实进度的进度条,百分比的进度文字跟随已完成进度的圆弧转动.以下是效果图: 这个自定义View可以根据需要设定圆环的宽度和百分比文字的大小. 先说一下思路:这个View一共分为三部分:第一部分也就是灰色的圆环部分,代表未完成的进度:第二部分是蓝色的圆弧部分,代表已经完成的进度:第三部分是红色的百分比的数字百分比文本,显示当前确切的完成进度. 下面是View的编写思路: ①:定义三个画笔,分别画灰色圆环,蓝色圆弧,红色文字: ②:

  • Android自定义带圆点的半圆形进度条

    本文实例为大家分享了Android自定义带圆点的半圆形进度条,供大家参考,具体内容如下 仅限用于半圆形,如须要带圆点的圆形进度条,圆点会出现错位现象,此代码仅供,带圆点的圆形进度条有空研究一下!图片效果在下方, import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import and

  • Android实现百分比下载进度条效果

    现在很多APP中都会集成下载功能,所以有一个方便好看又实用的进度条来展示下载进度很有必要,也能提高用户体验,在这里我就把项目里的下载进度条抽取出来分享给大家,话不多说,先看效果图: 这个进度条是自定义的一个View,其中有一个自定义属性就是百分比文字的大小(也可以把那两条显示颜色的进度条自定义属性,这里就没有实现,在代码里面写的). 先说说实现原理: 1:由于自定义了属性,所以先获取属性的值. 2:绘制底色那条灰色的线. 3:根据传入的数据计算当前百分比,然后绘制那条橘黄色的线. 4:再在橘黄色

  • Android实现下载进度条效果

    目录 最终效果和对比vivo商店效果 分析1 - 计算进度 分析2 - 绘制圆角矩形 解决方案 分析3 - 绘制文字和交汇 手势拓展 最终效果和对比vivo商店效果 vivo应用商店下载效果: 最终实现效果: 分析1 - 计算进度 进度计算就比较简单了,我们通过复写onSizeChanged()方法,获取到控件的宽后,先计算当前进度百分比,再将百分比乘以宽度,就可以得到应该绘制的宽度了. 绘制圆角矩形需要传一个Rect,Rect的构造方法需要传4个位置,分别是left.top.right.bot

  • Android编程实现通知栏进度条效果的方法示例

    本文实例讲述了Android编程实现通知栏进度条效果的方法.分享给大家供大家参考,具体如下: /** * 通知管理工具类 * * @description: * @author ldm * @date 2016-5-3 上午9:39:56 */ public class NotificationUtil { private Context mContext; // NotificationManager : 是状态栏通知的管理类,负责发通知.清楚通知等. private Notification

  • PyQt5实现下载进度条效果

    起因是因为公司要开发一款自动登录某网站的助手工具提供给客户使用,要使用到selenium,所以选择了pyqt5的方式来开发这个C/S架构的客户端 在过程中要用到自动更新的功能,所以自己写一个下载进度的插件给大家分享,本人编程水平有点菜,不要见怪. 界面文件UI_download.py # -*- coding: utf-8 -*- from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.Qt import Qt class Ui_downloa

  • Android打造炫酷进度条效果

    本文实例为大家分享了Android炫酷进度条效果的具体代码,供大家参考,具体内容如下 学习:视频地址 HorizontalProgressbarWithProgress的代码 import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Build; imp

  • Android中使用AsyncTask做下载进度条实例代码

    android AsyncTask做下载进度条 AsyncTask是个不错的东西,可以使用它来做下载进度条.代码讲解如下: package com.example.downloadfile; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.a

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

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

  • Android实现标题上显示隐藏进度条效果

    一个界面,实现在向页面添加图片时,在标题上显示一个水平进度条,当图片载入完毕后,隐藏进度条并显示图片 具体实现方法: res/layout/main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"

  • Android自定义View实现加载进度条效果

    上一篇文章总结了下自定义View的几个步骤,如果还有不清楚的同学可以先去看看Android自定义View(一),这篇文章和大家分享一下自定义加载进度条,效果如下 下面就以水平的进度条为列进行讲解: 1.首先还是在attrs.xml文件中自定义我们需要的属性: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="GradientP

  • android实现节点进度条效果

    本文实例为大家分享了android实现节点进度条效果展示的具体代码,供大家参考,具体内容如 代码: package utils.android.view.lxz; import java.util.ArrayList; import java.util.List; import com.community.custom.android.R; import android.app.Activity; import android.content.Context; import android.gr

随机推荐