转载请说明:这是作者的博客地址,在这里对他表示感谢!!
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条形 文字跟着变
祝天天快乐!
分享到:
相关推荐
NULL 博文链接:https://emmet1988.iteye.com/blog/1039730
android 自定义组合progressdialog进度条,方便你的使用............................................................................................
Android ProgressDialog 进度条对话框的模拟实现和代码解析,此为例子源代码,在本例中实现进度条需要调用onPrepareDialog()方法和showDialog(),应用程序处理进度条指示功能。
ProgressDialog进度条使用Demo
Android百分比加载进度条的实例,又一个使用ProgressDialog创建进度条的例子,进度条的实例方法,其实比较简单,先看以下代码: 重写onCreateDialog方法 switch(id){//对id进行判断 case PROGRESS_DIALOG://...
Android ProgressDialog进度条对话框
本源码主要是演示在Android中使用ProgressDialog,定义了两种常用的ProgressDialog进度对话框,一种是长形进度条,这是最早时候的进度条,有点像windows 7风格,另外上一种是圆形的进度条,这种进度条风格在目前的...
实现文件的复制 及 进度条的显示 progressdialog
源码下载 博文链接:https://edeis.iteye.com/blog/1021532
android dialog ——ProgressDialog 进度条对话框详解
Android中自定义ProgressDialog实现加载滚动条效果,例如显示“请稍后……”,希望对于有帮助
android progressDialog各种用法android progressDialog各种用法android progressDialog各种用法android progressDialog各种用法
此demo介绍了自定义的带有进度条的ProgressDialog.希望能够帮助需要的同学.
主要对Android开发之ProgressDialog读取文件进度进行解析,感兴趣的朋友可以参考一下
主要介绍了实例详解Android自定义ProgressDialog进度条对话框的实现的相关资料,需要的朋友可以参考下
android 自定义progressDialog实现 加载转圈等待
NULL 博文链接:https://android-zhang.iteye.com/blog/1611319
主要介绍了Android 中通过实现线程更新Progressdialog (对话进度条)的相关资料,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下