实现效果
实现代码
1、首先,创建一个类继承View,然后重写构造法:
public VerticalProgressBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
initPaint();
}
public VerticalProgressBar(Context context) {
this(context, null);
initPaint();
}
public VerticalProgressBar(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
final TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs, R.styleable.VerticalProgressBar, defStyleAttr, 0);
//初始化自定义属性
initByAttributes(attributes);
attributes.recycle();
//初始化画笔
initPaint();
}
这里先说说3个构造方法的区别:
public View (Context context)//是在java代码创建视图的时候被调用,如果是从xml填充的视图,就不会调用这个
public View (Context context, AttributeSet attrs)//这个是在xml创建但是没有指定style的时候被调用
public View (Context context, AttributeSet attrs, int defStyle)//需要使用到自定义属性时调用
系统自带的View可以在xml中配置属性,对于写的好的Custom View同样可以在xml中配置属性,为了使自定义的View的属性可以在xml中配置,需要以下4个步骤:
通过<declare-styleable>为自定义View添加属性
在xml中为相应的属性声明属性值
在运行时(一般为构造函数)获取属性值
将获取到的属性值应用到View
初始化自定义属性
/**
* @desc 初始化自定义属性
* */
private void initByAttributes(TypedArray attributes) {
//设置完成进度条颜色
mFinishColor = attributes.getColor(R.styleable.VerticalProgressBar_vp_finished_color, default_finished_color);
//设置未完成进度条颜色
mUnFinishColor = attributes.getColor(R.styleable.VerticalProgressBar_vp_unfinished_color, default_unfinished_color);