您的位置:首页 > 移动开发 > Android开发

自定义ProgressDialog

2015-12-14 16:13 459 查看
制作一个自定义的ProgressDialog大概可以分为以下几个步骤。

1:创建一个先的Class 继承自ProgressDialog

public MyProgressDialog(Context context) {
this(context, R.style.progressDialog);
}

其中theme参数是你所设定的ProgressDialog的属性 具体值如下:

<style name="progressDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<!-- 边框 -->
<item name="android:windowIsFloating">true</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 半透明 -->
<item name="android:windowNoTitle">true</item>
<!-- 无标题 -->
<item name="android:windowBackground">@color/transparent</item>
<!-- 背景透明 -->
<item name="android:backgroundDimEnabled">false</item>
<!-- 模糊 -->
</style>
如上属性中,backgroundDimEnabled 属性如果设为true 真个页面在展示你自己的ProgressDialog的同时也会显示一个浅灰色的半透明背景

2:创建自定义ProgressDialog的布局 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="96dp"
android:layout_height="90dp"
android:layout_centerInParent="true"
android:background="@drawable/progress_dialog_bg"
android:orientation="vertical">

<RelativeLayout
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">

<ImageView
android:id="@+id/progress_img"
android:layout_width="46dp"
android:layout_height="46dp"
android:adjustViewBounds="true"
android:layout_centerInParent="true"
android:src="@mipmap/loading_cir"/>

<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@mipmap/ic_android_white_24dp"
android:layout_centerInParent="true"/>

</RelativeLayout>

<TextView
android:paddingTop="3dp"
android:id="@+id/progress_msg"
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12dp"
android:textColor="@color/white"
android:layout_gravity="center_horizontal"
android:text="加载中……"/>

</LinearLayout>

</RelativeLayout>

效果图,大致如下所示:



3:在自定义的ProgressDialog中完成各种回调和设置

在onCreate中设置ContentView,就是刚才写的布局,之后将Dialog的window属性设置为MATCH_PARENT,cancelable设置为false

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progress_dialog_layout);
WindowManager.LayoutParams params=this.getWindow().getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
this.getWindow().setAttributes(params);

progress_img= (ImageView) findViewById(R.id.progress_img);

this.setCancelable(false);
this.setIndeterminate(true);
}

定义显示函数,其中使用了ObjectAnimator 可以使用其他动画代替。

public void showProgressDialog(){

this.show();
progress_rotate = ObjectAnimator.ofFloat(progress_img,"rotation",360f,0f);
progress_rotate.setRepeatMode(ValueAnimator.RESTART);
progress_rotate.setRepeatCount(-1);
progress_rotate.setDuration(2000);
progress_rotate.setInterpolator(new LinearInterpolator());
progress_rotate.start();
}

定义隐藏函数,记得关闭动画
public void hideProgressDialog(){

if (progress_rotate !=null)
progress_rotate.cancel();
this.cancel();
}

在很多时候Dialog设置了cancelable,点击空白和back键都无法隐藏Dialog,在此处可以重写OnBackPressed方法实现 点击空白不取消,点击Back取消的效果
@Override
public void onBackPressed() {
hideProgressDialog();
}

这样在别的地反创建自己定义的ProgressDialog就可以显示自定义的ProgressDialog了。

注意:因为dialog是带有主题参数的,所以在创建Dialog用到的Context对象,需要时Activity的,不可以使用Application的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android ProgressDialog