原文
ProgressBar
用于显示某个耗时操作完成的百分比的组件称为进度条。ProgressBar默认产生圆形进度条。
实现效果图:
MainActivity
import android.os.Bundle;
import android.view.View;
import android.app.Activity;
import android.widget.Button;
import java.util.Timer;
import java.util.TimerTask;public class MainActivity extends Activity {private RoundedRectProgressBar bar;private Button btn;private int progress;private Timer timer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bar = (RoundedRectProgressBar) findViewById(R.id.bar);btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {reset();}});}/*** 进度条从头到尾跑一次*/private void reset() {progress = 0;timer = new Timer();//以timer为参数,指定某个时间点执行线程timer.schedule(new TimerTask() {@Overridepublic void run() {bar.setProgress(progress);//设置当前进度progress ++;if (progress > 100) {timer.cancel();}}}, 0, 300); 0秒后启动任务,以后每隔0.3秒执行一次线程}
}
自定义进度条RoundedRectProgressBar.java:
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;public class RoundedRectProgressBar extends View {private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);private int barColor;private int backColor;private int textColor;private float radius;int progress = 0;@SuppressLint("NonConstantResourceId")public RoundedRectProgressBar(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);//获取自定义参数的颜色值TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.RoundedRectProgressBar, defStyle, 0);int n = a.getIndexCount();for (int i = 0; i < n; i++) {int attr = a.getIndex(i);if (attr == R.styleable.RoundedRectProgressBar_backColor) {backColor = a.getColor(attr, Color.GRAY);} else if (attr == R.styleable.RoundedRectProgressBar_barColor) {barColor = a.getColor(attr, Color.GREEN);} else if (attr == R.styleable.RoundedRectProgressBar_textColor) {textColor = a.getColor(attr, Color.WHITE);}}}public RoundedRectProgressBar(Context context, AttributeSet attrs) {this(context, attrs, 0);}public RoundedRectProgressBar(Context context) {this(context, null);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);radius = this.getMeasuredHeight() / 5;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//背景mPaint.setColor(backColor);mPaint.setStyle(Paint.Style.FILL);canvas.drawRoundRect(new RectF(0, 0, this.getMeasuredWidth(), this.getMeasuredHeight()), radius, radius, mPaint);//进度条mPaint.setColor(barColor);mPaint.setStyle(Paint.Style.FILL);canvas.drawRoundRect(new RectF(0, 0, this.getMeasuredWidth() * progress / 100f, this.getMeasuredHeight()), radius, radius, mPaint);//进度mPaint.setColor(textColor);mPaint.setTextSize(this.getMeasuredHeight() / 1.2f);String text = "" + progress + "%";float x = this.getMeasuredWidth() * progress / 100 - mPaint.measureText(text) - 10;float y = this.getMeasuredHeight() / 2f - mPaint.getFontMetrics().ascent / 2f - mPaint.getFontMetrics().descent / 2f;canvas.drawText(text, x, y, mPaint);}/*设置进度条进度, 外部调用*/public void setProgress(int progress) {if (progress > 100) {this.progress = 100;} else if (progress < 0) {this.progress = 0;} else {this.progress = progress;}postInvalidate();}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/white"tools:context="com.example.progressbarpro.MainActivity"><com.example.progressbarpro.RoundedRectProgressBarandroid:id="@+id/bar"android:layout_width="match_parent"android:layout_height="24dp"android:layout_marginTop="100dp"app:backColor="#E6E6E6"app:barColor="#33CC99"app:textColor="#FFFFFF"/><Buttonandroid:id="@+id/btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="reset"android:layout_centerInParent="true"/>
</RelativeLayout>
在values/attrs.xml中添加自定义参数, 使三种颜色可以在布局文件中被配置:
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="RoundedRectProgressBar"><attr name="backColor" format="color" /><attr name="barColor" format="color" /><attr name="textColor" format="color" /></declare-styleable></resources>