来自定义一个矩形的进度条
来源:互联网 发布:奇迹英语软件下载 编辑:程序博客网 时间: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
- 来自定义一个矩形的进度条
- 完成一个进度条的定义
- 自己定义一个带进度的圆形进度条
- 最屌最简单的圆形跟矩形进度条
- C#语法基础-定义一个矩形对象
- 扩展性极强的圆形进度条和矩形进度条
- 分析SequenceActivity和ConditionedActivityGroup来自定义一个可以回滚的Activity
- 定义一个类,封装矩形的长和宽;在定义一个类,继承自定义的这个类,在继承类中根据基类中封装的矩形的长和宽求矩形的面积。
- 一个简单的进度条
- 来自ThoughtWorks的敏捷团队角色定义
- Drawable Animation 可用来自定义进度条(轮播Drawable资源)
- 【java学习记录】7.定义一个接口ArearInterface,其中包含一个方法,计算面积三角形、矩形、圆形的面积
- 来自一个有用的信息
- 来自一个小人物的唠叨
- 带颜色渐变效果的的矩形进度条
- 矩形面积和矩形周长并的模板——来自notonlysuccess
- [PyOpenGL]一个简单的矩形
- 画一个白色的矩形
- 谷歌瓦片的网址
- RocketMQ 的基础与规范
- STL源码剖析之空间配置器
- hdu 4438 && la 6389
- Redis 用户验证
- 来自定义一个矩形的进度条
- TOJ 1825.Filling Out the Team
- php001-php基本概念
- arraylist安全性
- windows查看某个端口被谁占用
- intelliJ IDEA 快捷键
- day13String,StringBuffer,StringBuilder
- 通过StatusStrip访问 toolStripStatusLabel的属性
- ios 产生和监听事件notification