继承CompoundButton的设计巧思:ProgressButton如何玩转“图钉+进度“双状态
继承CompoundButton的设计巧思ProgressButton如何玩转图钉进度双状态【免费下载链接】progressbuttonA custom progress indicator with a tiny footprint.项目地址: https://gitcode.com/gh_mirrors/progre/progressbuttonProgressButton 是一个专为 Android 打造的图钉进度按钮Pin Progress Button用一个小小的圆形控件同时表达内容是否已固定和下载进度到哪了两件事。它的核心设计只有一句话继承自 CompoundButton让图钉状态免费复用了勾选框、开关按钮成熟的两状态交互体系。本文将带你快速看懂这套设计以及如何在自己的 App 里 5 分钟接入。为什么选 CompoundButton一行继承拿回整套两状态打开核心源码 ProgressButton.java你会看到整个类的第一行声明public class ProgressButton extends CompoundButtonCompoundButton 是 Android 里 CheckBox、RadioButton、ToggleButton 的共同基类天然自带选中/未选中两状态。ProgressButton 把已固定pinned映射为选中态、未固定unpinned映射为未选中态于是以下能力全部免费获得免费获得的能力对应 API查询/设置图钉状态isChecked()/setChecked()语义化的固定/取消固定isPinned()/setPinned()点击自动翻转状态toggle()状态变化监听无障碍、联动刷新setOnCheckedChangeListener()isPinned()内部只做了两件事——调用isChecked()setPinned()则在setChecked()之外补了一次invalidate()重绘ProgressButton.java。单元测试 ProgressButtonTest.java 专门验证了setPinned、toggle与监听器通知的行为这套薄封装正是本文标题中设计巧思的第一层不重复造轮子只做语义映射。三层绘制怎么叠阴影、进度环、图钉视觉上的图钉 进度环组合全部由onDraw()一笔笔画出来ProgressButton.java绘制顺序决定了层级关系底层进度环先画一整圈灰色圆环背景色再用drawArc()从 12 点钟方向按360 * progress / max的角度画出发光弧段——进度条由此而来中间图标层根据isChecked()的当前值在环内绘制对应的图钉 Drawable——选中画白色竖图钉未选中画灰色斜图钉顶层阴影最后叠加一层阴影 Drawable让图钉产生钉在环上的立体感。注意一个小细节进度弧段始终绘制在图钉下方所以无论图钉处于哪种朝向进度环都能清晰可读——这就是双状态互不干扰的视觉保证。两种玩法XML属性与代码方法双通道ProgressButton 支持 16 个自定义属性声明于 attrs.xml常用项如下progress/max当前进度与最大值默认 0 / 100circleColor/progressColor背景环颜色、进度弧颜色pinned/pinnedDrawable/unpinnedDrawable/shadowDrawable初始固定状态与三张状态图animating/animationSpeed/animationDelay/animationStripWidth不确定状态动画参数在布局里只需一个标签示例见 activity_main.xmlcom.f2prateek.progressbutton.ProgressButton android:idid/pin_progress_1 android:layout_widthwrap_content android:layout_heightwrap_content progress66 circleColor#B3B6B9 progressColor#1192E7/代码通道则是一组简洁的 setter任何时刻都能驱动两种状态button.setPinned(true); // 切换图钉状态 button.setProgress(45); // 更新下载进度默认样式定义在 styles.xml所有取值都有合理默认值示例 App 中还演示了不可点击的纯展示按钮与setClickable(true)的可交互按钮两种形态MainActivity.java这也是继承自 CompoundButton 的收益——可点击与否完全由你决定只做进度指示时保持默认不可点击需要用户固定/取消固定内容时打开点击即可。不确定状态动画与进度自动恢复下载任务不知道还要多久时ProgressButton 提供不确定进度动画startAnimating()启动后一条小弧段会绕环持续旋转stopAnimating()停止ProgressButton.java速度、帧间隔、弧段宽度均可通过animationSpeed、animationDelay、animationStripWidth三个参数微调。更贴心的是状态恢复ProgressButton 自定义了SavedStateProgressButton.java把progress和max一并存入 Parcelable。即使系统因内存不足回收了你的 Activity旋转中的图钉进度按钮也能原样复原——ProgressButtonTest.java 中的onSaveInstanceState测试专门保证了这一点。快速上手 ProgressButton 图钉按钮通过 Maven 引入com.f2prateek.progressbutton:progressbutton坐标见根目录 pom.xml 与 progressbutton/pom.xml布局中添加com.f2prateek.progressbutton.ProgressButton标签按需设置progress、颜色等属性下载回调中调用setProgress()实时刷新弧段任务开始/结束时用startAnimating()/stopAnimating()切换动画运行progressbutton-samples/目录下的示例 App对照Via XML与Via Code两行按钮直观感受双状态的全部组合。小结ProgressButton 用继承 CompoundButton这一个决定优雅地把图钉的两状态交互、监听回调、可点击行为全部收敛进标准 Android 控件体系再用不到 500 行代码补上了进度环绘制、不确定动画与状态恢复。如果你需要为列表项、卡片式布局添加一个小而完整的图钉下载指示器它是一个几乎零学习成本的理想选择。【免费下载链接】progressbuttonA custom progress indicator with a tiny footprint.项目地址: https://gitcode.com/gh_mirrors/progre/progressbutton创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考