`

【转】重写ProgressDialog,实现各种个性进度条需求,附上源码

阅读更多
转载请说明:这是作者的博客地址,在这里对他表示感谢!!
http://www.eoeandroid.com/thread-70136-1-1.html

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 name="Theme.Dialog.Alert"><item name="windowBackground">@android:color/transparent</item>

<item name="windowTitleStyle">@android:style/DialogWindowTitle</item>

<item name="windowIsFloating">true</item>

<item name="windowContentOverlay">@null</item>

</style>

但是发现他还关联其他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,布局是代码生成。

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

style="?android:attr/progressBarStyleHorizontal"

试问,如何代码实现?

先说第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条形  文字跟着变 

      祝天天快乐!
分享到:
评论

相关推荐

    【转】重写ProgressDialog,实现各种个性进度条需求,附上

    这篇博客的作者通过转帖分享了如何重写ProgressDialog,以实现更多样化的进度条效果,满足各种个性化的UI设计。 首先,我们了解下原生ProgressDialog的基本用法。原生的ProgressDialog通常包括两种模式:...

    android 自定义组合progressdialog进度条

    android 自定义组合progressdialog进度条,方便你的使用............................................................................................

    Android ProgressDialog 进度条对话框的模拟实现和代码解析.rar

    Android ProgressDialog 进度条对话框的模拟实现和代码解析,此为例子源代码,在本例中实现进度条需要调用onPrepareDialog()方法和showDialog(),应用程序处理进度条指示功能。

    ProgressDialog进度条使用

    ProgressDialog显示为一个带有进度条的对话框,可以是旋转的菊花或者水平的进度条,给用户一种正在处理事情的反馈,提升用户体验。 在“ProgressDialog进度条使用Demo”中,我们将学习如何在Android应用中有效地...

    Android源码:进度条对话框Demo源码

    在这个"Android源码:进度条对话框Demo源码"中,我们可以深入学习如何在实际应用中实现这个功能。 1. **ProgressDialog的使用** ProgressDialog是AlertDialog的一个子类,可以通过`new ProgressDialog(Context)`来...

    ProgressDialog进度条

    在Android开发中,ProgressDialog是一个非常常见的组件,它用于在执行耗时操作时向用户展示进度条,以提高用户体验。在Android应用中,当用户需要等待一段时间才能完成的操作(如网络请求、文件加载等)进行时,显示...

    又一个使用ProgressDialog创建Android进度条的例子.rar

    Android百分比加载进度条的实例,又一个使用ProgressDialog创建进度条的例子,进度条的实例方法,其实比较简单,先看以下代码:  重写onCreateDialog方法  switch(id){//对id进行判断  case PROGRESS_DIALOG://...

    Android ProgressDialog进度条对话框.rar

    在"Android ProgressDialog进度条对话框.rar"的压缩包中,可能包含了一些示例代码、XML布局文件和资源图片,供开发者参考和学习如何在实际项目中实现和优化进度条对话框。通过研究这些文件,开发者可以深入理解...

    ProgressDialog_android源码_

    在标题"ProgressDialog_android源码_"中,我们关注的是这个组件的内部实现。让我们深入探讨一下Android ProgressDialog的源码及其工作原理。 首先,ProgressDialog是Dialog类的一个子类,它继承了AlertDialog,并...

    带进度条的ProgressDialog

    在"TestProgressDialog01"项目中,开发者可能已经实现了以上步骤,并通过一个模拟的耗时任务来演示了进度条的更新。这可能包括一个后台线程或AsyncTask,该任务在执行过程中定期调用publishProgress()来触发...

    android dialog ——ProgressDialog 进度条对话框详解

    在本篇文章中,我们将深入探讨ProgressDialog的使用方法、特点以及如何自定义以满足特定需求。 一、ProgressDialog的基本用法 ProgressDialog通常在需要执行异步任务时使用,如下载文件、上传数据等。首先,我们...

    Android应用源码之进度条对话框Demo源码.zip

    本Demo源码着重展示了如何在Android应用程序中实现和使用进度条对话框。 1. **创建进度条对话框** 在Android中,我们可以使用`ProgressDialog`类来创建一个模态对话框,显示一个圆形或水平的进度条。在代码中,...

    android 对话框中的进度条 (ProgressDialog)

    在Android开发中,ProgressDialog是一个非常常见的组件,它用于在执行耗时操作时向用户展示一个对话框,通常显示一个进度条来表示任务的进度。这个组件对于提升用户体验至关重要,因为它可以告知用户应用正在进行...

    Android 定义了两种常用的ProgressDialog进度对话框源码.rar

    本源码主要是演示在Android中使用ProgressDialog,定义了两种常用的ProgressDialog进度对话框,一种是长形进度条,这是最早时候的进度条,有点像windows 7风格,另外上一种是圆形的进度条,这种进度条风格在目前的...

    安卓Android源码——进度条对话框Demo源码.zip

    这个"安卓Android源码——进度条对话框Demo源码.zip"文件包含了一个完整的示例项目,用于演示如何在Android应用程序中实现进度条对话框。 首先,`.classpath`文件是Eclipse(一种常用的Android开发IDE)的工作空间...

    progressDialog 自定义颜色与样式

    要更改ProgressDialog的背景或进度条颜色,可以通过创建自定义主题并在style.xml中定义来实现。例如,我们可以创建一个名为`customProgressDialogTheme`的新主题: ```xml &lt;item name="colorAccent"&gt;@color/...

    Android应用源码之进度条对话框Demo源码-IT计算机-毕业设计.zip

    本项目“Android应用源码之进度条对话框Demo源码”是一个适用于毕业设计学习的示例,旨在帮助学生理解如何在Android应用程序中实现实时反馈机制。 首先,我们需要了解ProgressDialog的基本使用方法。在Android中,...

    Android中自定义ProgressDialog实现加载滚动条效果,例如显示“请稍后……”

    在Android开发中,ProgressDialog是一种...总之,通过自定义ProgressDialog的布局和代码逻辑,我们能够实现各种各样的加载滚动条效果,提升应用的用户体验。在实际开发中,可以根据项目的具体需求灵活运用这些技巧。

Global site tag (gtag.js) - Google Analytics