这里两年前在eoe写的一个帖子,这次也搬过来统一管理:
==============
以前我自定义的进度条是从android的源码中扒出来的一个XML,然后把里面的图片给替换了。一直不知道它的具体原理是什么。
今天得空研究了一下,发现它的原理其实就是用的android提供的一个叫ClipDrawable的类实现的。
于是我就继续深入研究ClipDrawable的用法,研究的结果让我很开心,发现这个类可以很容易实现各种自定义进度条的效果。
ClipDrawable类继承自Drawable,具体用法如下:
1、先自定义一个XML(命名为clip.xml),放在Drawable文件夹下面:
- <?xml version="1.0" encoding="utf-8"?>
- <clip xmlns:android="http://schemas.android.com/apk/res/android"
- android:clipOrientation="horizontal"
- android:drawable="@drawable/green_progress_drawable"
- android:gravity="left" >
-
- </clip>
复制代码
2、在界面布局文件layout中引用上面定义的这个ClipDrawable,比如:
- <View
- android:id="@+id/image"
- android:layout_width="fill_parent"
- android:layout_height="22dip"
- android:layout_centerInParent="true"
- android:background="@drawable/clip" >
- </View>
复制代码
3、然后在代码中这么写就可以实现随意控制进度条的进度了:
- View imageview = findViewById(R.id.image);
- final ClipDrawable drawable = (ClipDrawable) imageview.getBackground();
- final Handler handler = new Handler() {
- public void handleMessage(Message msg) {
- if (msg.what == 0x1233) {
- drawable.setLevel(drawable.getLevel() + 30);
- }
- }
- };
- final Timer timer = new Timer();
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- Message msg = new Message();
- msg.what = 0x1233;
- handler.sendMessage(msg);
- if (drawable.getLevel() >= 10000 || isFinishing()) {
- timer.cancel();
- }
- }
- }, 0, 50);
复制代码
到这里自定义进度条就完成了。
特别说明几个问题:
1、clip.xml这个文件中有几个属性, android:clipOrientation="horizontal"表示水平或竖直;android:gravity="left"表示从左面开始,或从右面开始,或从上面开始,或从下面开始。
2、当然如果是要进度条那么引用的这个图片必然是.9.png格式的啦。
用这种方法可以自定义各种进度条了,非常方便。建议自定义的时候要把你定义的进度条封装成独立的类,这样方便修改和维护。
===============================
如果你觉得帮到了你,请给作者打赏一口饭吃:
![](https://img-blog.csdn.net/20170731181122832?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTU4MzgxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)