开源项目circular-progress-button源码分析

本文分析开源项目circular-progress-button,它提供了一个酷炫的圆形进度按钮。文章介绍了项目的基本信息,包括核心类CircularProgressButton、MorphingAnimation、CircularProgressDrawable和CircularAnimatedDrawable的详细讲解,以及如何初始化和执行进度变化。在深入源码前,建议读者熟悉Drawable和动画相关的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前一篇博客 开源项目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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值