这里两年前在eoe写的一个帖子,这次也搬过来统一管理:

==============

以前我自定义的进度条是从android的源码中扒出来的一个XML,然后把里面的图片给替换了。一直不知道它的具体原理是什么。


今天得空研究了一下,发现它的原理其实就是用的android提供的一个叫ClipDrawable的类实现的。
于是我就继续深入研究ClipDrawable的用法,研究的结果让我很开心,发现这个类可以很容易实现各种自定义进度条的效果。
ClipDrawable类继承自Drawable,具体用法如下:
1、先自定义一个XML(命名为clip.xml),放在Drawable文件夹下面:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <clip xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:clipOrientation="horizontal"
  4. android:drawable="@drawable/green_progress_drawable"
  5. android:gravity="left" >

  6. </clip>
复制代码 2、在界面布局文件layout中引用上面定义的这个ClipDrawable,比如:
  1. <View
  2. android:id="@+id/image"
  3. android:layout_width="fill_parent"
  4. android:layout_height="22dip"
  5. android:layout_centerInParent="true"
  6. android:background="@drawable/clip" >
  7. </View>
复制代码 3、然后在代码中这么写就可以实现随意控制进度条的进度了:
  1. View imageview = findViewById(R.id.image);
  2. final ClipDrawable drawable = (ClipDrawable) imageview.getBackground();
  3. final Handler handler = new Handler() {
  4. public void handleMessage(Message msg) {
  5. if (msg.what == 0x1233) {
  6. drawable.setLevel(drawable.getLevel() + 30);
  7. }
  8. }
  9. };
  10. final Timer timer = new Timer();
  11. timer.schedule(new TimerTask() {
  12. @Override
  13. public void run() {
  14. Message msg = new Message();
  15. msg.what = 0x1233;
  16. handler.sendMessage(msg);
  17. if (drawable.getLevel() >= 10000 || isFinishing()) {
  18. timer.cancel();
  19. }
  20. }
  21. }, 0, 50);
复制代码 到这里自定义进度条就完成了。
特别说明几个问题:
1、clip.xml这个文件中有几个属性, android:clipOrientation="horizontal"表示水平或竖直;android:gravity="left"表示从左面开始,或从右面开始,或从上面开始,或从下面开始。
2、当然如果是要进度条那么引用的这个图片必然是.9.png格式的啦。

用这种方法可以自定义各种进度条了,非常方便。建议自定义的时候要把你定义的进度条封装成独立的类,这样方便修改和维护。

更多相关文章

  1. android中自定义数据类型在两个activity间的传递
  2. 代码混淆—android被反编译的两种解决方案
  3. android之自定义控件一控件的呈现机制
  4. AS下如何生成自定义的.jks签名文件, 以及如何生成数字签名
  5. Android自定义字体类库Calligraphy--快速实现自定义应用字体
  6. Android 底部弹出自定义Dialog(支付宝微信选择)
  7. android实现自定义控件及如何在其他项目中使用
  8. android 自定义状态栏和导航栏分析与实现

随机推荐

  1. 创建数据库
  2. php之数据库链式操作
  3. PHP:oop->细说命名空间/命名空间类的自动
  4. js的for和php的for
  5. 4-29数组系统函数的操作
  6. 210428 PHP 函数 返回值 参数 闭包/匿名
  7. 【PHP 面向对象】面向对象(OOP)编程之解
  8. 12345
  9. 美团App插件化实践
  10. 【直播】美团点评技术沙龙Online006: WWD