前言
最近项目有个需求, 需要一个展示下载状态的按钮, 类似这样:
这个效果有多种方法都可以实现, 最初的思路是在自定义view里封装一个ProgressBar
/Button
, 然后根据状态设置两个控件Visibility
, 后来想了想还是放弃了ProgressBar
, 直接使用了ClipDrawable
作为 BackgroundDrawable
实现的, 感觉更方便一些.
Github 上存有完整代码: https://github.com/YouCii/LearnApp/blob/master/app/src/main/java/com/youcii/mvplearn/widget/DownLoadButton.kt
转载请标明出处, 原文地址:
https://blog.csdn.net/j550341130/article/details/83993676
核心类
1. ClipDrawable
这是一个按比例裁剪的Drawable
, 可以使用它实现按百分比进度填充红色的部分. Clip的布局 bg_download_button_clip
具体写法如下:
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="horizontal"
android:drawable="@drawable/bg_download_button_downloading"
android:gravity="left"/>
其中 android:gravity
是用来设置裁剪起始位置, 有多种属性可以设置, 具体可以搜一下.
内部的 bg_download_button_downloading
就是一个完整填充的红色背景
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="100px"/>
<solid android:color="#D8413A"/>
</shape>
在代码中获取方法与普通Drawable
一样
private var solidDrawable: Drawable? = resources.getDrawable(R.drawable.bg_download_button_clip)
然后通过设置solidDrawable
的level
来实现进度, level
最大是10000, 所以设置进度时需要这样做
solidDrawable?.level = currentPercent * 100
注意, ClipDrawable
只是一个按某规则进行裁剪的Drawable
, 最外部是没有边框的, 想要一个固定存在的边框的话仅用ClipDrawable
就不够了, 需要叠加一个普通的边框Drawable
, 这就需要用到LayerDrawable
了.
2. LayerDrawable</