自定义Android下载进度条:实现百分比效果

0 下载量 158 浏览量 更新于2024-08-28 收藏 72KB PDF 举报
"Android实现一个百分比下载进度条的自定义View,通过获取自定义属性、绘制底色和进度条以及显示百分比文字来达到效果。" 在Android开发中,创建一个具有百分比显示的下载进度条可以极大地提升用户体验。为了实现这样一个自定义的进度条,开发者通常会通过自定义View来完成。在这个案例中,我们将探讨如何实现这样的功能。 首先,我们需要在`attrs.xml`文件中定义自定义属性。在这个例子中,我们只有一个属性`dptextsize`,用于设置百分比文字的大小,其格式为尺寸(dimension)。以下是`attrs.xml`文件的内容: ```xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="downloadProgressBar"> <attr name="dptextsize" format="dimension"/> </declare-styleable> </resources> ``` 接下来,我们创建一个名为`DownLoadProgressbar`的自定义View类。这个类需要继承自`View`,并实现绘制进度条的功能。在类中,我们需要获取自定义属性的值,这可以通过`TypedArray`来完成。此外,还需要重写`onDraw()`方法来绘制进度条的背景(灰色线)、当前进度(橘黄色线)以及百分比文字。以下是一个简化的`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; public class DownLoadProgressbar extends View { private int dpTextSize; // 自定义属性,百分比文字大小 public DownLoadProgressbar(Context context) { this(context, null); } public DownLoadProgressbar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DownLoadProgressbar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(attrs); } private void init(AttributeSet attrs) { if (attrs != null) { TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.downloadProgressBar); dpTextSize = array.getDimensionPixelSize(R.styleable.downloadProgressBar_dptextsize, 16); // 获取dptextsize属性的值 array.recycle(); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制灰色底色线条 Paint backgroundPaint = new Paint(); backgroundPaint.setColor(getResources().getColor(android.R.color.darker_gray)); canvas.drawRect(0, 0, getWidth(), getHeight(), backgroundPaint); // 计算并绘制进度条(橘黄色线条) int progress = ...; // 从实际下载进度获取 Paint progressPaint = new Paint(); progressPaint.setColor(getResources().getColor(android.R.color.holo_orange_light)); float progressWidth = ...; // 根据进度计算宽度 canvas.drawRect(0, 0, progressWidth, getHeight(), progressPaint); // 绘制百分比文字 String percentageText = String.format("%.0f%%", progress * 100f); Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); textPaint.setTextSize(dpTextSize); textPaint.setColor(getResources().getColor(android.R.color.black)); Rect bounds = new Rect(); textPaint.getTextBounds(percentageText, 0, percentageText.length(), bounds); int x = (getWidth() - bounds.width()) / 2; int y = (getHeight() + bounds.height()) / 2; canvas.drawText(percentageText, x, y, textPaint); } } ``` 在实际使用时,你需要在布局文件中引用这个自定义View,并设置`dptextsize`属性。例如: ```xml <com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar android:id="@+id/progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content" app:dptextsize="14dp" /> ``` 最后,你可以在Activity或Fragment中获取这个自定义View,并根据下载进度更新`DownLoadProgressbar`的`progress`值,然后调用`invalidate()`方法触发重绘,以实时显示下载进度。 通过这种方式,你就能在Android应用中实现一个美观且实用的百分比下载进度条,提升用户对下载过程的感知和体验。