Android自定义ProgressDialog

来源:互联网 发布:2016淘宝报名双11入口 编辑:程序博客网 时间:2024/05/20 09:27

我们在开发Android上应用程序时,有很多时候会遇到“延时”等待的情况,例如数据加载时,尤其是在联网的时候,请求网络会有个等待时间,在这个等待的时间里需要给用户一个友好的提示,提示用户现在正在做什么操作,需要耐心等待等等,这时一个进度对话框就可以解决。Android提供给我们一个很好的控件叫ProgressDialog,用来创建自定义信息以及一些相关操作,唯一不好的一点就是Android原生控件给我一种一如既往的单调和丑陋,下面是原生ProgressDialog的源码以及效果:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
publicclass MainActivity extendsActivity {
 
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        ProgressDialog dialog = newProgressDialog(this);
        dialog.setMessage(登录中……);
        dialog.show();
 
    }
}

\

 

 

源码极其简单,效果也极其简陋,怎么看怎么不爽。那么怎样让这个ProgressDialog看起来爽点呢?其实不妨做一个自定义的ProgressDialog,先看一下自定义ProgressDialog的效果吧!

\

好了,看上去不错吧!下面开始一步一步来实现!

1,自定义ProgressDialog的布局。

 

?
1
2
3
4
5
6
7
8
<!--?xml version=1.0encoding=utf-8?-->
<linearlayout android:background="@drawable/progress_custom_bg"android:gravity="center_horizontal"android:layout_gravity="center"android:layout_height="wrap_content"android:layout_width="wrap_content"android:orientation="vertical"android:paddingbottom="20dp"android:paddingleft="30dp"android:paddingright="30dp"android:paddingtop="20dp"xmlns:android="http://schemas.android.com/apk/res/android">
 
    <imageview android:background="@anim/spinner"android:id="@+id/spinnerImageView"android:layout_height="wrap_content"android:layout_width="wrap_content">
 
    <textview android:id="@+id/message"android:layout_height="wrap_content"android:layout_margintop="15dp"android:layout_width="wrap_content"android:text="Message"android:textcolor="#FFFFFF">
 
</textview></imageview></linearlayout>

2,滚动条的背景设置。

 

上面的XML布局中可以看到滚动条是一个ImageView,需要给ImageView设置一个动态的背景,那这个动态的背景该怎么办呢?其实就是给ImageView一个动画背景,给出一定数量的图片,在动画中按一定时间匀速切换图片即可,图片资源如下:

\

在res/anim文件夹建立这样一个动画集spinner.xml:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <item android:drawable="@drawable/spinner_0"android:duration="60/">
    <item android:drawable="@drawable/spinner_1"android:duration="60/">
    <item android:drawable="@drawable/spinner_2"android:duration="60/">
    <item android:drawable="@drawable/spinner_3"android:duration="60/">
    <item android:drawable="@drawable/spinner_4"android:duration="60/">
    <item android:drawable="@drawable/spinner_5"android:duration="60/">
    <item android:drawable="@drawable/spinner_6"android:duration="60/">
    <item android:drawable="@drawable/spinner_7"android:duration="60/">
    <item android:drawable="@drawable/spinner_8"android:duration="60/">
    <item android:drawable="@drawable/spinner_9"android:duration="60/">
    <item android:drawable="@drawable/spinner_10"android:duration="60/">
    <item android:drawable="@drawable/spinner_11"android:duration="60/">
</item></item></item></item></item></item></item></item></item></item></item></item></animation-list>
然后给整个的ProgressDialog设置一个背景色progress_custom_bg.xml:

 

 

?
1
2
3
4
5
6
7
8
<!--?xml version=1.0encoding=UTF-8?-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
 
    <solid android:color="#ff404040">
 
    <corners android:bottomleftradius="8dp"android:bottomrightradius="8dp"android:topleftradius="8dp"android:toprightradius="8dp">
 
</corners></solid></shape>

 

然后还需要给自定义ProgressDialog设置一个风格,在res/value/style.xml下这样定义:

 

?
1
2
3
4
5
6
7
<!-- 自定义Dialog --><style name="Custom_Progress"parent="@android:style/Theme.Dialog"type="text/css"><item name=android:windowFrame>@null</item>
    <item name=android:windowIsFloating>true</item>
    <item name=android:windowContentOverlay>@null</item>
    <item name=android:windowAnimationStyle>@android:style/Animation.Dialog</item>
    <item name=android:windowSoftInputMode>stateUnspecified|adjustPan</item>
    <item name=android:windowBackground>@android:color/transparent</item>
    <item name=android:windowNoTitle>true</item></style>

 

3,接下来进入重点,我们通过代码来构建一个自定义的ProgressDialog,具体做法就是自定义类继承Dialog:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
packagecom.example.myexample;
 
importandroid.app.Dialog;
importandroid.content.Context;
importandroid.graphics.drawable.AnimationDrawable;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.WindowManager;
importandroid.widget.ImageView;
importandroid.widget.TextView;
 
publicclass CustomProgress extendsDialog {
    publicCustomProgress(Context context) {
        super(context);
    }
 
    publicCustomProgress(Context context, inttheme) {
        super(context, theme);
    }
 
    /**
     * 当窗口焦点改变时调用
     */
    publicvoid onWindowFocusChanged(booleanhasFocus) {
        ImageView imageView = (ImageView) findViewById(R.id.spinnerImageView);
        // 获取ImageView上的动画背景
        AnimationDrawable spinner = (AnimationDrawable) imageView.getBackground();
        // 开始动画
        spinner.start();
    }
 
    /**
     * 给Dialog设置提示信息
     *
     * @param message
     */
    publicvoid setMessage(CharSequence message) {
        if(message != null&& message.length() > 0) {
            findViewById(R.id.message).setVisibility(View.VISIBLE);
            TextView txt = (TextView) findViewById(R.id.message);
            txt.setText(message);
            txt.invalidate();
        }
    }
 
    /**
     * 弹出自定义ProgressDialog
     *
     * @param context
     *            上下文
     * @param message
     *            提示
     * @param cancelable
     *            是否按返回键取消
     * @param cancelListener
     *            按下返回键监听
     * @return
     */
    publicstatic CustomProgress show(Context context, CharSequence message, booleancancelable, OnCancelListener cancelListener) {
        CustomProgress dialog = newCustomProgress(context, R.style.Custom_Progress);
        dialog.setTitle();
        dialog.setContentView(R.layout.progress_custom);
        if(message == null|| message.length() == 0) {
            dialog.findViewById(R.id.message).setVisibility(View.GONE);
        }else{
            TextView txt = (TextView) dialog.findViewById(R.id.message);
            txt.setText(message);
        }
        // 按返回键是否取消
        dialog.setCancelable(cancelable);
        // 监听返回键处理
        dialog.setOnCancelListener(cancelListener);
        // 设置居中
        dialog.getWindow().getAttributes().gravity = Gravity.CENTER;
        WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
        // 设置背景层透明度
        lp.dimAmount = 0.2f;
        dialog.getWindow().setAttributes(lp);
        // dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
        dialog.show();
        returndialog;
    }
}
在Activity中引用自定义ProgressDialog:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
publicclass MainActivity extendsActivity {
 
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        CustomProgress.show(this, 登录中..., true,null);
 
    }
}
0 0
原创粉丝点击