自定义进度条TestProgressBar
public class TestProgressBar extends View {
private Paint paint;
private int color;
private int bgSpace = 4; //背景间距
/**
* 最大进度
*/
private int max;
/**
* 当前进度
*/
private int progress;
public TestProgressBar(Context context) {
this(context, null);
}
public TestProgressBar(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public TestProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.TestProgressBar);
color = mTypedArray.getColor(R.styleable.TestProgressBar_progressColor, Color.RED);
paint = new Paint();
paint.setColor(color);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (max == 0) {
return;
}
//画矩形
canvas.drawRect(bgSpace, bgSpace, ((getWidth() - bgSpace * 2) * progress / max) + bgSpace, getHeight() - bgSpace, paint);
}
/**
* 获取进度.需要同步
*
* @return
*/
public synchronized int getProgress() {
return progress;
}
/**
* 设置进度的最大值![](http://)
*
* @param max
*/
public synchronized void setMax(int max) {
if (max < 0) {
return;
}
this.max = max;
}
public synchronized int getMax() {
return max;
}
/**
* 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步
* 刷新界面调用postInvalidate()能在非UI线程刷新
*
* @param progress
*/
public synchronized void setProgress(int progress) {
if (progress < 0) {
return;
}
if (progress > max) {
progress = max;
}
if (progress <= max) {
this.progress = progress;
postInvalidate();
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.t.progressbarapp.view.TestProgressBar
android:id="@+id/progress_bar"
android:layout_width="200dp"
android:layout_height="30dp"
android:layout_marginTop="20dp"
android:background="@mipmap/icon_test_content_data_bar_bg"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:progressColor="@color/orange" />
<com.t.progressbarapp.view.RoundProgressBar
android:id="@+id/round_progress_bar"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_marginTop="100dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:roundColor="@color/box"
app:roundProgressColor="@color/orange"
app:roundWidth="10dp"
app:textSize="20sp" />
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="70dp"
android:text="开始测试"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="停止测试"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
调用
public class MainActivity extends AppCompatActivity {
private Button btnStart;
private Button btnStop;
private TestProgressBar progressBar;
private RoundProgressBar roundProgressBar;
private int mCurrentProgress;
private boolean isStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
setListener();
}
private void setListener() {
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isStart) {
return;
}
isStart = true;
mCurrentProgress = 0;
new Thread(progressRunnable).start();
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isStart = false;
}
});
}
private Runnable progressRunnable = new Runnable() {
@Override
public void run() {
while (isStart) {
if (mCurrentProgress <= roundProgressBar.getMax()) {
mCurrentProgress += 1;
roundProgressBar.setProgress(mCurrentProgress);
progressBar.setProgress(mCurrentProgress);
}else {
isStart = false;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
private void init() {
btnStart = findViewById(R.id.btn_start);
btnStop = findViewById(R.id.btn_stop);
progressBar = findViewById(R.id.progress_bar);
roundProgressBar = findViewById(R.id.round_progress_bar);
progressBar.setMax(500);
roundProgressBar.setMax(500);
}
}
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TasksCompletedView">
<attr name="radius" format="dimension"/>
<attr name="strokeWidth" format="dimension"/>
<attr name="circleColor" format="color"/>
<attr name="ringColor" format="color"/>
</declare-styleable>
<declare-styleable name="RoundProgressBar">
<attr name="roundColor" format="color"/>
<attr name="roundProgressColor" format="color"/>
<attr name="roundWidth" format="dimension"></attr>
<attr name="textColor" format="color" />
<attr name="textSize" format="dimension" />
<attr name="max" format="integer"></attr>
<attr name="textIsDisplayable" format="boolean"></attr>
<attr name="style">
<enum name="STROKE" value="0"></enum>
<enum name="FILL" value="1"></enum>
</attr>
</declare-styleable>
<declare-styleable name="TestProgressBar">
<attr name="progressColor" format="color"/>
</declare-styleable>
</resources>
项目效果