Android 自定义Progress Bar

简介:

Android 提供ProgressDialog,可以提示进度,但你也可以自己实现,示例如下:

 


<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    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:id="@+id/progressbar_default"  
        android:scaleType="fitCenter" android:layout_alignParentLeft="true"  
        android:layout_margin="5dip" />  
  
  
    <ProgressBar android:layout_width="fill_parent"  
        android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal"  
        android:id="@+id/progressbar_Horizontal" 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:id="@+id/progressbar_text"  
        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的构造函数

  1. public ProgressDialog(Context 
  2. context) 
  3. <P p 
  4. {

  5. this(context, 
  6. com.android.internal.R.style.Theme_Dialog_Alert);

  7. }
复制代码
中涉及了一个theme:com.android.internal.R.style.Theme_Dialog_Alert,这是我当时遇到的第一个问题,开始的时候翻遍源码,终于在data/res/values/themes.xml里找到,
  1. <style name="Theme.Dialog.Alert"><item name="windowBackground">@android:color/transparent</item> 

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

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

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

  5. </style>
复制代码
但是发现他还关联其他style,继续找下去,结果写到自己的XML里还是错误一大堆,最后仔细看了下,发现不就是个theme吗,这就简单了,有2种方向:1.自己写theme.2.使用系统的theme。我写的时候是
  1. public ProgressDialog1(Context context) {
  2.        this(context, android.R.style.Theme_Panel);
  3.         mContext = context;
  4.         }
复制代码
调用系统的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的设置。
以下工具类是转载网上那位朋友的工具类,大家可以借鉴下!
  1. public class BeanUtils {
  2. private BeanUtils() {
  3. }
  4. public static void setFieldValue(final Object object,
  5.    final String fieldName, final Object value) {
  6.   Field field = getDeclaredField(object, fieldName);
  7.   if (field == null)
  8.    throw new IllegalArgumentException("Could not find field ["
  9.      + fieldName + "] on target [" + object + "]");
  10.   makeAccessible(field);
  11.   try {
  12.    field.set(object, value);
  13.   } catch (IllegalAccessException e) {
  14.   }
  15. }
  16. protected static Field getDeclaredField(final Object object,
  17.    final String fieldName) {
  18.   return getDeclaredField(object.getClass(), fieldName);
  19. }
  20. protected static Field getDeclaredField(final Class clazz,
  21.    final String fieldName) {
  22.   for (Class superClass = clazz; superClass != Object.class; superClass = superClass
  23.     .getSuperclass()) {
  24.    try {
  25.     return superClass.getDeclaredField(fieldName);
  26.    } catch (NoSuchFieldException e) {
  27.    }
  28.   }
  29.   return null;
  30. }
  31. protected static void makeAccessible(Field field) {
  32.   if (!Modifier.isPublic(field.getModifiers())
  33.     || !Modifier.isPublic(field.getDeclaringClass().getModifiers())) {
  34.    field.setAccessible(true);
  35.   }
  36. }
  37. }
复制代码
有了上面的工具类,就可以简单的设置那些私有属性
比如:        
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

相关文章
|
5月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
449 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
5月前
|
Android开发
Android自定义view之利用PathEffect实现动态效果
本文介绍如何在Android自定义View中利用`PathEffect`实现动态效果。通过改变偏移量,结合`PathEffect`的子类(如`CornerPathEffect`、`DashPathEffect`、`PathDashPathEffect`等)实现路径绘制的动态变化。文章详细解析了各子类的功能与参数,并通过案例代码展示了如何使用`ComposePathEffect`组合效果,以及通过修改偏移量实现动画。最终效果为一个菱形图案沿路径运动,源码附于文末供参考。
|
5月前
|
Android开发 开发者
Android自定义view之利用drawArc方法实现动态效果
本文介绍了如何通过Android自定义View实现动态效果,重点使用`drawArc`方法完成圆弧动画。首先通过`onSizeChanged`进行测量,初始化画笔属性,设置圆弧相关参数。核心思路是不断改变圆弧扫过角度`sweepAngle`,并调用`invalidate()`刷新View以实现动态旋转效果。最后附上完整代码与效果图,帮助开发者快速理解并实践这一动画实现方式。
140 0
|
5月前
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
|
5月前
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
225 65
Android自定义view之网易云推荐歌单界面
|
5月前
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
552 84
|
5月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
5月前
|
前端开发 Android开发 UED
讲讲Android为自定义view提供的SurfaceView
本文详细介绍了Android中自定义View时使用SurfaceView的必要性和实现方式。首先分析了在复杂绘制逻辑和高频界面更新场景下,传统View可能引发卡顿的问题,进而引出SurfaceView作为解决方案。文章通过Android官方Demo展示了SurfaceView的基本用法,包括实现`SurfaceHolder.Callback2`接口、与Activity生命周期绑定、子线程中使用`lockCanvas()`和`unlockCanvasAndPost()`方法完成绘图操作。
113 3
|
5月前
|
Android开发 开发者
Android自定义view之围棋动画(化繁为简)
本文介绍了Android自定义View的动画实现,通过两个案例拓展动态效果。第一个案例基于`drawArc`方法实现单次动画,借助布尔值控制动画流程。第二个案例以围棋动画为例,从简单的小球直线运动到双向变速运动,最终实现循环动画效果。代码结构清晰,逻辑简明,展示了如何化繁为简实现复杂动画,帮助读者拓展动态效果设计思路。文末提供完整源码,适合初学者和进阶开发者学习参考。
Android自定义view之围棋动画(化繁为简)
|
11月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
157 1

热门文章

最新文章