来自定义一个矩形的进度条

来源:互联网 发布:奇迹英语软件下载 编辑:程序博客网 时间:2024/06/08 17:37

  接下来我们通过一个矩形进度条来学习一下onMeasure和onDraw方法应该怎么写:

  这个矩形进度条选择直接继承自View,如果我们对控件的宽高没有要求,onMeasure方法其实就可以不用重写,但是现在我有一个需求,在设置控件的LayoutParams的宽高时,取较大的一项作为边长画正方形 ,这时应该怎么做呢?

  比如android:layout_width="60dp"  android:layout_height="80dp" ,如果不重写onMeasure方法,即按照View的measure规则,整个空间宽高就是60、80dp。这时候想画一个边长为80dp的正方形就会出现问题,如下图所示:

  

  也就是说我们只能画到如上图红色部分,因为实际宽高就是这个大,我们不能超出它,所以这时候就要重写一下onMeasure方法,来重新设置实际宽高值。

  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getMeasureResult(widthMeasureSpec);
int height = getMeasureResult(heightMeasureSpec);
//取最大值作为边长
int size = Math.max(width, height);
setMeasuredDimension(size, size);
  }

  这样设置之后,就能保证实际的宽和高都是80dp(两者中最大的那一个)。

  然后是onDraw方法,这里先贴出我的代码:

   protected void onDraw(Canvas canvas) {
initPaint();
// 边长
int length = getMeasuredWidth();
// 周长
int perimeter = 4 * length;
Rect rect = new Rect(0, 0, length, length);
canvas.drawRect(rect, paint);


paint.setStrokeWidth(progressWidth);
paint.setColor(progressColor);
int progress_validity = checkProgressValidity(progress);
Log.e("muxi", "progress_validity:" + progress_validity);
switch (progress_validity) {
case PROGRESS_FLAT:
break;
case PROGRESS_HIGH:
// 画满进度
canvas.drawRect(rect, paint);
break;
default:
// paint.setStrokeWidth(progressWidth);
// paint.setColor(progressColor);
// 根据进度画进度条
Log.e("muxi", "progress:" + progress);
float specific_value = progress / 100f;
// Log.e("muxi", "比值:"+specific_value);
float progress_length = specific_value * perimeter;
// Log.e("muxi", "进度条长度:"+progress_length);
// 第几条边开始
int side_sn = (int) (progress_length / length);
// 从当前边开始画多长
float side_length = progress_length % (float) length;
if (side_sn == 0) {
canvas.drawLine(0, 0, side_length, 0, paint);
} else if (side_sn == 1) {
canvas.drawLine(0, 0, length, 0, paint);
canvas.drawLine(length, 0, length, side_length, paint);
} else if (side_sn == 2) {
canvas.drawLine(0, 0, length, 0, paint);
canvas.drawLine(length, 0, length, length, paint);
canvas.drawLine(length, length, length - side_length, length,
paint);
} else {
canvas.drawLine(0, 0, length, 0, paint);
canvas.drawLine(length, 0, length, length, paint);
canvas.drawLine(length, length, 0, length, paint);
canvas.drawLine(0, length, 0, length - side_length, paint);
}
break;
}
}

    代码比较简单,我也基本写有注释,大致就是底下先画一个方形,再根据进度画线。

  完整的代码我放到了github上:https://github.com/pearflower/rectprogress

0 0