Android百分比下载进度条

 

Android百分比下载进度条

标签: android下载进度条百分比进度条进度条
  1273人阅读  评论(0)  收藏  举报
  分类:

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


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

先说说实现原理:

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

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

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

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

现在来看看代码:

一:属性设置attrs.xml文件

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <declare-styleable name="downloadProgressBar">  
  4.         <attr name="dptextsize" format="dimension"/>  
  5.     </declare-styleable>  
  6. </resources>  
其中dptextsize就是自定义属性的名字


二:自定义view DownLoadProgressbar.Java

[java]  view plain  copy
  1. package com.ywl5320.downloadprogressdemo.downloadview;  
  2.   
  3. import android.content.Context;  
  4. import android.content.res.TypedArray;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Rect;  
  8. import android.util.AttributeSet;  
  9. import android.view.View;  
  10. import android.view.ViewTreeObserver.OnGlobalLayoutListener;  
  11.   
  12. import com.ywl5320.downloadprogressdemo.R;  
  13.   
  14. /** 
  15.  * 下载进度条 
  16.  *  
  17.  * @author ywl 
  18.  * 
  19.  */  
  20. public class DownLoadProgressbar extends View {  
  21.   
  22.     private Paint paint = new Paint(); // 绘制背景灰色线条画笔  
  23.     private Paint paintText = new Paint(); // 绘制下载进度画笔  
  24.     private float offset = 0f; // 下载偏移量  
  25.     private float maxvalue = 0f; // 下载的总大小  
  26.     private float currentValue = 0f; // 下载了多少  
  27.     private Rect mBound = new Rect(); // 获取百分比数字的长宽  
  28.     private String percentValue = "0%"// 要显示的现在百分比  
  29.     private float offsetRight = 0f; // 灰色线条距离右边的距离  
  30.     private int textSize = 25// 百分比的文字大小  
  31.     private float offsetTop = 18f; // 距离顶部的偏移量  
  32.   
  33.     public DownLoadProgressbar(Context context) {  
  34.         this(context, null);  
  35.         // TODO Auto-generated constructor stub  
  36.     }  
  37.   
  38.     public DownLoadProgressbar(Context context, AttributeSet attribute) {  
  39.         this(context, attribute, 0);  
  40.     }  
  41.   
  42.     public DownLoadProgressbar(Context context, AttributeSet attrs,  
  43.             int defStyleAttr) {  
  44.         super(context, attrs, defStyleAttr);  
  45.         // TODO Auto-generated constructor stub  
  46.         // 获取自定义属性,给textsize赋初始值  
  47.         TypedArray t = getContext().obtainStyledAttributes(attrs,  
  48.                 R.styleable.downloadProgressBar);  
  49.         textSize = (int) t.getDimension(  
  50.                 R.styleable.downloadProgressBar_dptextsize, 36);  
  51.         getTextWidth();  
  52.     }  
  53.   
  54.     @Override  
  55.     protected void onDraw(Canvas canvas) {  
  56.         // TODO Auto-generated method stub  
  57.         super.onDraw(canvas);  
  58.         // 绘制底色  
  59.         paint.setColor(getResources().getColor(R.color.no1_gray_light));  
  60.         paint.setStrokeWidth(1);  
  61.         canvas.drawLine(0, offsetTop, getWidth(), offsetTop, paint);  
  62.         // 绘制进度条颜色  
  63.         paint.setColor(getResources().getColor(R.color.no2_orange));  
  64.         paint.setStrokeWidth(2);  
  65.         canvas.drawLine(0, offsetTop, offset, offsetTop, paint);  
  66.         // 绘制白色区域及百分比  
  67.         paint.setColor(getResources().getColor(R.color.no3_white));  
  68.         paint.setStrokeWidth(1);  
  69.         paintText.setColor(getResources().getColor(R.color.no2_orange));  
  70.         paintText.setTextSize(textSize);  
  71.         paintText.setAntiAlias(true);  
  72.         paintText.getTextBounds(percentValue, 0, percentValue.length(), mBound);  
  73.         canvas.drawLine(offset, offsetTop, offset + mBound.width() + 4, offsetTop, paint);  
  74.         canvas.drawText(percentValue, offset, offsetTop + mBound.height() / 2 - 2, paintText);  
  75.     }  
  76.   
  77.     /** 
  78.      * 设置当前进度值 
  79.      *  
  80.      * @param currentValue 
  81.      */  
  82.     public void setCurrentValue(float currentValue) {  
  83.         this.currentValue = currentValue;  
  84.         int value = (int) (this.currentValue / maxvalue * 100);  
  85.         if (value < 100) {  
  86.             percentValue = value + "%";  
  87.         } else {  
  88.             percentValue = "100%";  
  89.         }  
  90.         initCurrentProgressBar();  
  91.         invalidate();  
  92.     }  
  93.   
  94.     /** 
  95.      * 设置最大值 
  96.      *  
  97.      * @param maxValue 
  98.      */  
  99.     public void setMaxValue(float maxValue) {  
  100.         this.maxvalue = maxValue;  
  101.     }  
  102.   
  103.     /** 
  104.      * 获取当前进度条长度 
  105.      *  
  106.      * @param maxValue 
  107.      * @param currentValue 
  108.      * @return 
  109.      */  
  110.     public void initCurrentProgressBar() {  
  111.         getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {  
  112.   
  113.             @Override  
  114.             public void onGlobalLayout() {  
  115.                 // TODO Auto-generated method stub  
  116.                 if (currentValue < maxvalue) {  
  117.                     offset = (getWidth() - offsetRight) * currentValue / maxvalue;  
  118.                 } else {  
  119.                     offset = getWidth() - offsetRight;  
  120.                 }  
  121.             }  
  122.         });  
  123.   
  124.     }  
  125.   
  126.     /** 
  127.      * 获取“100%”的宽度 
  128.      */  
  129.     public void getTextWidth() {  
  130.         Paint paint = new Paint();  
  131.         Rect rect = new Rect();  
  132.         paint.setTextSize(textSize);  
  133.         paint.setAntiAlias(true);  
  134.         paint.getTextBounds("100%"0"100%".length(), rect);  
  135.         offsetRight = rect.width() + 5;  
  136.     }  
  137. }  


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

三:Activity布局文件 activity_main.xml

[html]  view plain  copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     xmlns:ywl="http://schemas.android.com/apk/res/com.ywl5320.downloadprogressdemo" <!-- 这就是为自定义属性添加命名空间,注意res后的是:程序包名-->  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:background="@color/no3_white"  
  7.     tools:context="${relativePackage}.${activityClass}" >  
  8.       
  9.     <TextView   
  10.         android:id="@+id/tv_start"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="50dip"  
  13.         android:layout_below="@+id/rl_progress"  
  14.         android:layout_marginTop="40dip"  
  15.         android:layout_marginLeft="20dip"  
  16.         android:layout_marginRight="20dip"  
  17.         android:gravity="center"  
  18.         android:background="@drawable/btn_blue_selector"  
  19.         android:text="开始"/>  
  20.       
  21.     <RelativeLayout  
  22.         android:id="@+id/rl_progress"  
  23.         android:layout_width="match_parent"  
  24.         android:layout_marginLeft="20dip"  
  25.         android:layout_marginRight="20dip"  
  26.         android:layout_marginTop="30dip"  
  27.         android:layout_height="50dip">  
  28.         <TextView  
  29.             android:id="@+id/tv_size"  
  30.             android:layout_width="wrap_content"  
  31.             android:layout_height="wrap_content"  
  32.             android:layout_marginTop="4dip"  
  33.             android:textColor="@color/no5_gray_silver"  
  34.             android:textSize="12sp" />  
  35.   
  36.         <TextView  
  37.             android:id="@+id/tv_speed"  
  38.             android:layout_width="wrap_content"  
  39.             android:layout_height="wrap_content"  
  40.             android:layout_alignParentRight="true"  
  41.             android:layout_marginTop="6dip"  
  42.             android:textColor="@color/no5_gray_silver"  
  43.             android:textSize="12sp" />  
  44.   
  45.         <com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar  
  46.             android:id="@+id/dp_game_progress"  
  47.             android:layout_width="match_parent"  
  48.             android:layout_height="wrap_content"  
  49.             ywl:dptextsize="14sp" <!-- 这里设置控件的字体大小为14sp -->  
  50.             android:layout_below="@+id/tv_size">  
  51.         </com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar>  
  52.     </RelativeLayout>  
  53.   
  54. </RelativeLayout>  

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

四:MainAcativity.java

[java]  view plain  copy
  1. package com.ywl5320.downloadprogressdemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.TextView;  
  9.   
  10. import com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar;  
  11.   
  12. public class MainActivity extends Activity {  
  13.   
  14.     private TextView mStart;  
  15.     private TextView mSize;  
  16.     private TextView mSpeed;  
  17.     private DownLoadProgressbar mProgress;  
  18.     private int max = 100//总的大小  
  19.     private int current = 0//当前下载大小  
  20.     private String speed = "1"//下载速度  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.         mStart = (TextView) findViewById(R.id.tv_start);  
  27.         mProgress = (DownLoadProgressbar) findViewById(R.id.dp_game_progress);  
  28.         mSize = (TextView) findViewById(R.id.tv_size);  
  29.         mSpeed = (TextView) findViewById(R.id.tv_speed);  
  30.         //初始化下载进度  
  31.         mSize.setText(current + "MB/" + max + "MB");  
  32.         //初始化下载速度  
  33.         mSpeed.setText(speed + "MB/s");  
  34.         mStart.setOnClickListener(new OnClickListener() {  
  35.   
  36.             @Override  
  37.             public void onClick(View v) {  
  38.                 // TODO Auto-generated method stub  
  39.                 start();  
  40.             }  
  41.         });  
  42.     }  
  43.   
  44.     //循环模拟下载过程  
  45.     public void start() {  
  46.         if (current <= max) {  
  47.             mSize.setText(current + "MB/" + max + "MB");  
  48.             mSpeed.setText(speed + "MB/s");  
  49.             mProgress.setMaxValue(max);  
  50.             mProgress.setCurrentValue(current);  
  51.             handler.postDelayed(runnable, 100);  
  52.         } else {  
  53.             handler.removeCallbacks(runnable);  
  54.         }  
  55.   
  56.     }  
  57.   
  58.     Handler handler = new Handler();  
  59.     Runnable runnable = new Runnable() {  
  60.         @Override  
  61.         public void run() {  
  62.             // TODO Auto-generated method stub  
  63.             current = current + 1;  
  64.             start();  
  65.         }  
  66.     };  
  67.   
  68. }  

就这样一个简单实用的下载百分比进度条就实现了,有需要可以直接用就行: 免费下载地址
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值