本文主要是介绍开源项目circular-progress-button源码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在之前一篇博客 开源项目android-process-button使用和源码分析 中,讲解了dmytrodanylyk大神的带进度显示的按钮。今天再来介绍该作者的另一个开源项目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
这篇关于开源项目circular-progress-button源码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!