您的位置:首页 > 移动开发 > Android开发

Android 自定义方形进度条

2016-07-05 17:44 337 查看




效果图如上,自定义方形的进度条,第一个是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());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: