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());
}
相关文章推荐
- Android SQLite数据库版本升级原理解析
- Context全解析 --> Context都没弄明白,还怎么做Android开发?
- 安卓(Android)应用版本更新方法
- 图片下载“不容易”
- Android SDK开发包国内下载地址
- android简单计时器的开发
- 【Android应用开发】Android Studio 错误集锦 -- 将所有的 AS 错误集合到本文
- Android ScrollView监听值判断在底部还是顶部
- android小项目 连接PHP开发的服务端
- Android接入支付宝支付服务
- Android之权重layout_weight的真正用法
- Android ButterKnife框架学习
- TabLayout的自定义实现
- 让Android服务变为前台服务
- android动态测量控件
- Android画图
- android 显示Gift图片
- Tabhost的用法
- android用wifi进行adb调试
- android动画的实现