Android 自定义Progress Bar
Android 提供ProgressDialog,可以提示进度,但你也可以自己实现,示例如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andro android:layout_gravity="center_vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android: android:scaleType="fitCenter" android:layout_alignParentLeft="true" android:layout_margin="5dip" /> <ProgressBar android:layout_width="fill_parent" android:layout_height="wrap_content" android: android:max="100" android:layout_toRightOf="@id/progressbar_default" android:layout_margin="5dip" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android: android:layout_toRightOf="@id/progressbar_default" android:paddingTop="25dip" android:layout_margin="5dip" android:text="init text"/> </RelativeLayout>
public class ClearProgressDialog extends AlertDialog implements DialogInterface.OnClickListener { private ProgressBar progressBar; private int progress = 0; protected ClearProgressDialog(Context context) { super(context); init(); } public ClearProgressDialog(Context context, boolean cancelable, OnCancelListener cancelListener) { super(context, cancelable, cancelListener); init(); } public ClearProgressDialog(Context context, int theme) { super(context, theme); init(); } public void init() { View view = getLayoutInflater().inflate(R.layout.progresslayout, null); progressBar = (ProgressBar) view.findViewById(R.id.progressbar_Horizontal); setButton(getContext().getText(R.string.stop), this); setIcon(R.drawable.andclear); setTitle(R.string.clear_progress); setView(view); //progressBar = (ProgressBar) findViewById(R.id.progressbar_Horizontal); } public void onClick(DialogInterface dialog, int which) { } Handler pHandle = new Handler() { public void handleMessage(Message msg) { } }; public void setProgress(int per, String str) { } public void stop() { } }
重写android.app.ProgressDialog实现自定义进度条弹出框布局
1.简介系统ProgressDialog的主要特征
1.在ProgressDialog的源码里可以明显的看到,在STYLE_HORIZONTAL和STYLE_SPINNER分别显示的是不同的XML,这就意味着你的进度条要么是转圈,要么是条形的。
2.不管是上述的任何情况下,系统对各部分文字显示都已经完全格式化。
2.实际情况
但是实际的应用中,我们或者需要改变文字的位置,或者需要转圈和条形共存,甚至是做出完全颠覆系统进度条的个性进度条,这个时候我们必须去重新设计属于你自己的进度条。(个人一直认为应用中的组件尽量不用系统的,而是重写系统的,这样做出来的应用才是百家争鸣)。
下面就实现我自己的进度条中碰到的几个可能需要注意的地方给大家交待下:
1.在系统ProgressDialog的构造函数
-
public ProgressDialog(Context
-
context)
-
<P p
-
{
-
-
this(context,
-
com.android.internal.R.style.Theme_Dialog_Alert);
-
- }
-
<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>
-
public ProgressDialog1(Context context) {
-
this(context, android.R.style.Theme_Panel);
-
mContext = context;
- }
注意:找个地方就是你个性释放的开始。
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条形 文字跟着变
源码:https://files.cnblogs.com/shanzei/TestProgress.rar
最后更新:2017-04-03 22:15:27