在之前一篇博客
开源项目android-process-button使用和源码分析 中,讲解了dmytrodanylyk大神的带进度显示的按钮。
(2).成员变量初始化
CircularProgressButton在构造方法中完成对成员变量的初始化操作。
通过getResources().getColorStateList(id)方法,根据id获取ColorStateList对象(参数id是在xml中定义的selector,其中包含了各个不同状态下的颜色值),然后赋值给相应的ColorStateList对象。再通过colorStateList.getColorForState(int[] stateSet, int defaultColor)方法取出各个状态下的color,调用stateListDrawable.addState(int[] stateSet, Drawable drawable)将颜色值添加到三个StateListDrawable对象中。参数stateSet同在xml中设置的state一致,包括state_enabled、state_focused、state_pressed等。
今天再来介绍该作者的另一个开源项目circular-progress-button,效果更酷炫。
项目地址:
https://github.com/dmytrodanylyk/circular-progress-button
其中包含项目源码和示例代码。
运行效果图:
在分析该项目的源码之前,需要一些准备工作。关于Drawable,需要熟悉GradientDrawable和StateListDrawable类,ColorStateList类,以及如何继承Drawable类实现自己的drawable。对于动画,需要了解ValueAnimator和ObjectAnimator类的使用。
一、核心类的介绍
CircularProgressButton:圆形进度按钮,引用该开源项目时使用的控件。
MorphingAnimation:执行按钮的变换动画。比如从按钮变成圆环,按钮在不同状态之间的变换。
CircularProgressDrawable:圆环进度的Drawable,进度从0执行到100即结束。
CircularAnimatedDrawable:圆环动画的Drawable,使用该Drawable圆环会一直循环执行动画。
二、初始化
(1).成员变量介绍
private StrokeGradientDrawable background;// 背景
private CircularAnimatedDrawable mAnimatedDrawable;// 圆环动画
private CircularProgressDrawable mProgressDrawable;// 圆环进度
private ColorStateList mIdleColorState;// 默认
private ColorStateList mCompleteColorState;// 完成
private ColorStateList mErrorColorState;// 错误
private StateListDrawable mIdleStateDrawable;// 默认
private StateListDrawable mCompleteStateDrawable;// 完成
private StateListDrawable mErrorStateDrawable;// 错误
private String mIdleText;// 默认
private String mCompleteText;// 完成
private String mErrorText;// 错误
private String mProgressText;// 进度中
private enum State {
IDLE,// 默认
PROGRESS,// 进度中
COMPLETE,// 完成
ERROR// 错误
}
(2).成员变量初始化
CircularProgressButton在构造方法中完成对成员变量的初始化操作。
通过getResources().getColorStateList(id)方法,根据id获取ColorStateList对象(参数id是在xml中定义的selector,其中包含了各个不同状态下的颜色值),然后赋值给相应的ColorStateList对象。再通过colorStateList.getColorForState(int[] stateSet, int defaultColor)方法取出各个状态下的color,调用stateListDrawable.addState(int[] stateSet, Drawable drawable)将颜色值添加到三个StateListDrawable对象中。参数stateSet同在xml中设置的state一致,包括state_enabled、state_focused、state_pressed等。
// 初始化mErrorStateDrawable
private void initErrorStateDrawable() {
int colorPressed = getPressedColor(mErrorColorState);
StrokeGradientDrawable drawablePressed = createDrawable(colorPressed);
mErrorStateDrawable = new StateListDrawable();
mErrorStateDrawable.addState(new int[]{android.R.attr.state_pressed}, drawablePressed.getGradientDrawable());
mErrorStateDrawable.addState(StateSet.WILD_CARD, background.getGradientDrawable());
}
// 初始化mCompleteStateDrawable
private void initCompleteStateDrawable() {
int colorPressed = getPressedColor(mCompleteColorState);
StrokeGradientDrawable drawablePressed = createDrawable(colorPressed);
mCompleteStateDrawable = new StateListDrawable();
mCompleteStateDrawable.addState(new int[]{android.R.attr.state_pressed}, drawablePressed.getGradientDrawable());
mCompleteStateDrawable.addState(StateSet.WILD_CARD, background.getGradientDrawable());
}
// 初始化mIdleStateDrawable
private void initIdleStateDrawable() {
int colorNormal = getNormalColor(mIdleColorState);
int colorPressed = getPressedColor(mIdleColorState);
int colorFocused = getFocusedColor(mIdleColorState);
int colorDisabled = getDisabledColor(mIdleColorState);
if (background == null) {
background = createDrawable(colorNormal);
}
StrokeGradientDrawable drawableDisabled = createDrawable(colorDisabled);
StrokeGradientDrawable drawableFocused = createDrawable(colorFocused);
StrokeGradientDrawable drawablePressed = createDrawable(colorPressed);
mIdleStateDrawable = new StateListDrawable();
mIdleStateDrawable.addState(new int[]{android.R.attr.state_pressed}, drawablePressed