效果图如上,自定义方形的进度条,第一个是100%,第二个是70%
其实很简单的,就Path类
public class SquareProgressBar extends View {
private int progress = 70;//进度
private int strokeWidth = 20;
private Paint paint = null;
private Path path = null;
private int margin;
public SquareProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
paint = new Paint();
margin = convertDpToPx(10, context);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(context.getResources().getColor(
android.R.color.holo_red_dark));
paint.setStrokeWidth(margin);
paint.setAntiAlias(true);
paint.setStyle(Style.STROKE);
path = new Path();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float scope = getMeasuredWidth() * 2 + getMeasuredHeight() * 2;
DrawLocation mLocation = getLocation(scope);
if (mLocation.place == Place.TOP) {
path.moveTo(margin, 10);
path.lineTo(mLocation.location, 10);
canvas.drawPath(path, paint);
}
if (mLocation.place == Place.RIGHT) {
path.moveTo(margin, 10);
path.lineTo(getMeasuredWidth()-10, 10);
path.moveTo(getMeasuredWidth() - 10, 10);
path.lineTo(getMeasuredWidth(), mLocation.location);
canvas.drawPath(path, paint);
}
if (mLocation.place == Place.BOTTOM) {
path.moveTo(margin, 10);
path.lineTo(getMeasuredWidth(), 10);
path.moveTo(getMeasuredWidth() - 10, 10);
path.lineTo(getMeasuredWidth() - 10, getMeasuredHeight());
path.moveTo(getMeasuredWidth() - 10, getMeasuredHeight());
path.lineTo(mLocation.location, getMeasuredHeight());
canvas.drawPath(path, paint);
}
if (mLocation.place == Place.LEFT) {
path.moveTo(margin, 10);
path.lineTo(getMeasuredWidth(), 10);
path.moveTo(getMeasuredWidth() - 10, 10);
path.lineTo(getMeasuredWidth() - 10, getMeasuredHeight());
path.moveTo(getMeasuredWidth() - 10, getMeasuredHeight());
path.lineTo(margin, getMeasuredHeight());
path.moveTo(margin, getMeasuredHeight());
path.lineTo(margin, mLocation.location);
Log.i("lcf", " mLocation.location = " + mLocation.location);
canvas.drawPath(path, paint);
}
}
public void setProgress(int progress) {
this.progress = progress;
postInvalidate();
}
private DrawLocation getLocation(float scope) {
float length = scope * progress / 100;
DrawLocation mLocation = new DrawLocation();
if (length > getMeasuredWidth()) {
float second = length - getMeasuredWidth();
if (second > getMeasuredHeight()) {
float third = second - getMeasuredHeight();
if (third > getMeasuredWidth()) {
float four = third - getMeasuredWidth();
mLocation.place = Place.LEFT;
mLocation.location = getMeasuredHeight() - four;
} else {
mLocation.place = Place.BOTTOM;
mLocation.location = getMeasuredWidth() - third;
}
} else {
mLocation.place = Place.RIGHT;
mLocation.location = second;
}
} else {
mLocation.place = Place.TOP;
mLocation.location = length;
}
return mLocation;
}
private class DrawLocation {
public Place place;
public float location;
}
public enum Place {
LEFT, RIGHT, TOP, BOTTOM
}
public int convertDpToPx(float dp, Context context) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
context.getResources().getDisplayMetrics());
}