博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重写ProgressDialog,实现各种个性进度条需求(含源码)
阅读量:7239 次
发布时间:2019-06-29

本文共 2827 字,大约阅读时间需要 9 分钟。

导读:在实际的应用中,我们或者需要改变文字的位置,或者需要转圈和条形共存,甚至是做出完全颠覆系统进度条的个性进度条,这个时候我们必须去重新设计属于你自己的进度条。(个人一直认

 

  1.简介系统ProgressDialog的主要特征

  1.在ProgressDialog的源码里可以明显的看到,在STYLE_HORIZONTAL和STYLE_SPINNER分别显示的是不同的XML,这就意味着你的进度条要么是转圈,要么是条形的。

  2.不管是上述的任何情况下,系统对各部分文字显示都已经完全格式化。

  2.实际情况

  但是实际的应用中,我们或者需要改变文字的位置,或者需要转圈和条形共存,甚至是做出完全颠覆系统进度条的个性进度条,这个时候我们必须去重新设计属于你自己的进度条。(个人一直认为应用中的组件尽量不用系统的,而是重写系统的,这样做出来的应用才是百家争鸣)。

  下面就实现我自己的进度条中碰到的几个可能需要注意的地方给大家交待下:

  1.在系统ProgressDialog的构造函数

  public ProgressDialog(Context context){

  this(context,

  com.android.internal.R.style.Theme_Dialog_Alert);

  }

  中涉及了一个theme:com.android.internal.R.style.Theme_Dialog_Alert,这是我当时遇到的第一个问题,开始的时候翻遍源码,终于在data/res/values/themes.xml里找到,

  但是发现他还关联其他style,继续找下去,结果写到自己的XML里还是错误一大堆,最后仔细看了下,发现不就是个theme吗,这就简单了,有2种方向:1.自己写theme.2.使用系统的theme。我写的时候是

  public ProgressDialog1(Context context) {

  this(context, android.R.style.Theme_Panel);

  mContext = context;

  }

  调用系统的android.R.style.Theme_Panel.

  注意:找个地方就是你个性释放的开始。

  2.我要实现的是转圈和条形并存。那么肯定得在布局文件上下手了。

  找个地方分2块说.第1,布局是XML文件;2,布局是代码生成。

  您可能会问,这有区别吗?事实上,区别还是蛮大的,不知道你注意到没有如下属性

  

  试问,如何代码实现?

  先说第1种,XML的话比较简单,因为只需要写2个ProgressBar,然后再在代码里控制visible属性就ok,在此不赘述。

  第2种,style的实现,这是我碰到的第2个难点

  最后我在网上找到1篇文章,关于获取父类私有属性的文章,利用反射机制实现了style的设置。

  以下工具类是转载网上那位朋友的工具类,大家可以借鉴下!

  

public class BeanUtils {
private BeanUtils() {
} public static void setFieldValue(final Object object, final String fieldName, final Object value) {
Field field = getDeclaredField(object, fieldName); if (field == null) throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]"); makeAccessible(field); try {
field.set(object, value); } catch (IllegalAccessException e) {
} } protected static Field getDeclaredField(final Object object, final String fieldName) {
return getDeclaredField(object.getClass(), fieldName); } protected static Field getDeclaredField(final Class clazz, final String fieldName) {
for (Class superClass = clazz; superClass != Object.class; superClass = superClass .getSuperclass()) {
try {
return superClass.getDeclaredField(fieldName); } catch (NoSuchFieldException e) {
} } return null; } protected static void makeAccessible(Field field) {
if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())) {
field.setAccessible(true); } } }

 

  有了上面的工具类,就可以简单的设置那些私有属性

  比如:

  BeanUtils.setFieldValue(progress_h, "mOnlyIndeterminate", new Boolean(false));

  BeanUtils.setFieldValue(progress_h, "mMinHeight", new Integer(15));

  以上就是我重写进度条的全部心得,希望能对阅读完得朋友有些许帮助!

  最后附上我的demo,里面我的调用的布局是代码实现的,当然也有XML的。

 

demo说明:功能是前30条形,30-70转圈,70-100条形 文字跟着变

源码:http://files.cnblogs.com/shanzei/TestProgress.rar

 

转自:

转载于:https://www.cnblogs.com/shanzei/archive/2012/03/23/2413883.html

你可能感兴趣的文章
django的模板语言中一些之前没有用过的小点
查看>>
类继承
查看>>
Manacher HDOJ 5371 Hotaru's problem
查看>>
iOS所有常见证书,appID,Provisioning Profiles配置说明及制作图文教程
查看>>
iTop4412时钟配置
查看>>
Hibernate用JPA注解 CascadeType.REMOVE 不起作用的解决办法
查看>>
hibernate--一对多单向关联 (重点!!!)
查看>>
[Union]C++中Union学习笔记
查看>>
python面向对象三大特征
查看>>
iOS - SQLite 数据库存储
查看>>
线程、任务和同步学习笔记(五)
查看>>
远程控制之登录界面设计
查看>>
objc/runtime.h 查看私有api
查看>>
Linux下执行jmeter脚本
查看>>
java笔记之分支、循环语句
查看>>
我的Ajax学习笔记
查看>>
Struts2遇到Caused by Action class not found这类问题怎么解决
查看>>
ViewPager实现滑动翻页效果
查看>>
自定义HorizontalScrollView的scrollBar
查看>>
轻量高效的开源JavaScript插件和库
查看>>